﻿Imports Commander_Wars.Spieletools
'Imports System.Speech
'Imports System.Speech.Recognition
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX.DirectPlay
Public Enum Sprachen
    Deutsch
    English
    'Francais
    'Espanol
    'Italiano
End Enum
Public Enum Armeen
    OS
    BM
    GE
    YC
    BH
    MA
    AC
    BD
    JS
    PC
    TG
    DM
End Enum
<Serializable()> Public Enum Nebelarten
    Aus
    Nebel
    Kriegsnebel
End Enum
Public Enum CommanderWarsGameModi
    AdvanceWars
    AdvanceWars2
    AdvanceWarsDS
    CommanderWars
    AdvanceWarsDC
    ''' <summary>
    ''' Der neue CoW Modus
    ''' </summary>
    ''' <remarks></remarks>
    CommanderWars2
    ''' <summary>
    ''' Fire Emblem MOD unfinished
    ''' </summary>
    ''' <remarks></remarks>
    FireEmblem
End Enum
Public Enum TerrainStyle
    AdvanceWars
    AdvanceWars2
    CommanderWars
    AdvanceWarsDC
    CommanderWars2
    CustomTerrainstyle1
    CustomTerrainstyle2
    CustomTerrainstyle3
End Enum
Public Class Hauptmenü

#Region "Win32 API"
    Public Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal Taste As Int16) As Short
    Function getTasteGedrückt(ByVal Taste As Keys) As Boolean
        If IsNothing(Taste) Then Return False

        Dim b As Short = GetAsyncKeyState(Taste)
        If b = 0 Then Return 0 Else Return 1
    End Function
#End Region
#Region "Konstanten"
    Public Shared NeutralFarbe As Color = Color.FromArgb(255, 255, 255, 255)
    ''' <summary>
    ''' Die Einfärbe Farbe des Neutralen Spielers
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared SpielerNeutral As Color = Color.FromArgb(255, 230, 230, 230)
    Public Const FeldbreiteKlein As Integer = 16
    Public Const FeldbreiteGroß As Integer = 24
    Public Shared Feldbreite As Integer = FeldbreiteKlein
    Public Shared ZoomedIn As Boolean = False
    Public Const Breitbild As Single = 1 + 6 / 10
    Public Shared Rand As New Point
    Public Shared LobbyGUID As Guid = New Guid("774416c5-3e4b-40b7-adf6-208256be8d6b")
    Public Shared SpielGUID As Guid = New Guid("a75e5f62-841a-46a2-b1fa-0612e1557bd3")


#End Region
#Region "Variablen"
    Public Shared ErsterStart As Boolean = True
    Public Shared AlleFarbtabellen() As Color = {}
    Public Shared Formmodus As Formmodi = Formmodi.Hauptmenü
    Public Verwalter As Objektverwalter = Nothing
    Public Shared SpielfeldPunkt As Point
    Public Shared MusikAnhalten As Boolean = False
    Public Shared Debbuging As Boolean = True
    Public Shared MainMenü As Hauptmenü
#Region "Enumerationen"
    Enum Formmodi
        Hauptmenü
        Spiel
        Editor
        Optionen
        Kartenauswahl
        KartenauswahlMP
        LandkartenAuswahlKAMP
        SiegMenü
        Credits
        KOZufallMenü
        EinheitenAuswahlMenü
    End Enum

#End Region
#Region "Engines"
    Public Shared Bildengine As Grafikengine = Nothing
    Public Shared Schrift As Schriftengine = Nothing
#End Region
#End Region
#Region "Spielstart"
    Public Sub New()
        ' Dieser Aufruf ist für den Windows Form-Designer erforderlich.
        InitializeComponent()
        ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
        MainMenü = Me
        If Environment.CommandLine.ToLower.Contains("reset ") Then
            SetStandardEinstellungen(False)
        End If
        If Environment.CommandLine.ToLower.Contains("resetx ") Then
            SetStandardEinstellungen(True)
        End If
        If My.Settings.CommanderWarsGameMoodus < 0 Then
            My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.CommanderWars
        ElseIf My.Settings.CommanderWarsGameMoodus > CommanderWarsGameModi.CommanderWars2 Then
            My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.CommanderWars
        End If
        If My.Settings.TerrainStyle < 0 Then
            My.Settings.TerrainStyle = TerrainStyle.CommanderWars
        ElseIf My.Settings.TerrainStyle > TerrainStyle.CustomTerrainstyle3 Then
            My.Settings.TerrainStyle = TerrainStyle.CommanderWars
        End If
        My.Settings.Save()
    End Sub
    Public Sub SetStandardEinstellungen(ByVal Sicherermodus As Boolean)
        My.Settings.Reset()
        If Sicherermodus Then
            My.Settings.BildschirmBreite = 800
            My.Settings.BildschirmHöhe = 600
            My.Settings.Sprache = Sprachen.English
            My.Settings.Autor = "Anonym"
            My.Settings.draw3D = False
            My.Settings.Fenstermodus = True
            My.Settings.Größe = New Size(800, 600)
            My.Settings.Hintergrundmusik = False
            My.Settings.MusikSound = False
            My.Settings.LetztesSpiel = ""
            My.Settings.TexturQuali = "Low"
            My.Settings.Verhältnis = 4 / 3
        End If
        My.Settings.Save()
    End Sub
    Public Shared Sub SetStandardBildFormat()
        If My.Settings.Fenstermodus Then
            'Größe definieren
            My.Settings.BildschirmBreite = 800
            My.Settings.BildschirmHöhe = 600
            My.Settings.Save()
            MainMenü.Size = New Size(800, 600)
        Else
            My.Settings.BildschirmBreite = My.Computer.Screen.Bounds.Width
            My.Settings.BildschirmHöhe = My.Computer.Screen.Bounds.Height
            My.Settings.Save()
            MainMenü.Size = New Size(My.Settings.BildschirmBreite, My.Settings.BildschirmHöhe)
        End If
        MainMenü.FormBorderStyle = ChangeFormBorderStyle()
    End Sub
    Public Sub LoadForm()
        AktualisierenTaskbar()

        ' CreateAllMasksSubDirectory("C:\Programmierung\Commander Wars\Programm\Masken\")
        'My.Settings.draw3D = False
        'My.Settings.Save()
        SetStandardBildFormat()

        If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Intro\Intro.avi") And (Not My.Settings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt) Then
            If My.Settings.Fenstermodus Then
                Hauptmenü.MainMenü.pVideo.Height = Me.MalPanel.Height
                Hauptmenü.MainMenü.pVideo.Width = Me.MalPanel.Width
                VideoKlasse.Neu(My.Settings.Resourcenpfad + "Intro\Intro.avi", Hauptmenü.MainMenü.pVideo, False, True)
            Else
                Hauptmenü.MainMenü.pVideo.Height = Me.MalPanel.Height
                Hauptmenü.MainMenü.pVideo.Width = Me.MalPanel.Width
                VideoKlasse.Neu(My.Settings.Resourcenpfad + "Intro\Intro.avi", Hauptmenü.MainMenü.pVideo, True, True)
            End If
        End If

        If VideoKlasse.BeschäftigtAbspielen Then
            Hauptmenü.MainMenü.Visible = True
        Else
            Hauptmenü.MainMenü.Visible = False
        End If

        If My.Computer.FileSystem.DirectoryExists(My.Settings.Resourcenpfad + "Einheiten\") = False Then
            My.Settings.ErsterStart = False
        End If
        If My.Settings.ErsterStart = False Then
            Dim s As String = System.Windows.Forms.Application.ExecutablePath
            'Nur beim Testen muss die untere Zeile 3 mal durchgeführt werden
            s = s.Remove(s.LastIndexOf("\"))
            '#################################
            If Not My.Computer.FileSystem.DirectoryExists(s + "\Resources\Scripts") Then
                s = s.Remove(s.LastIndexOf("\"))
                s = s.Remove(s.LastIndexOf("\"))
            End If
            '#################################
            s = s + "\Resources\"

            My.Settings.Resourcenpfad = s
            My.Computer.FileSystem.CreateDirectory(My.Settings.Resourcenpfad + "Karten\")
            'Wir legen den Bildschirmausschnitt fest
            BildschirmGrößeverändern(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
            My.Settings.ErsterStart = True
            My.Settings.Save()
        End If

        Cursor.Hide()

        Me.Visible = True
        If Not VideoKlasse.BeschäftigtAbspielen Then Hauptmenü.MainMenü.Visible = False
        'Hier werden die Verweise erstellt
        Me.UpdateStart.Start()
    End Sub
    Private Sub Spielladen()
       



        'If Not VideoKlasse.Beschäftigtabspielen Then Me.Visible = False
        SprachIni()
        Me.Location = New Point(0, 0)
        Me.Verwalter = New Objektverwalter()
        'Grafikengine laden
        If My.Settings.Fenstermodus Then
            Bildengine = New Grafikengine(My.Settings.BildschirmBreite, My.Settings.BildschirmHöhe, Me.MalPanel, True)
        Else 'Falls wir richtigen Vollbild einführen
            Bildengine = New Grafikengine(My.Settings.BildschirmBreite, My.Settings.BildschirmHöhe, Me.MalPanel, True)
        End If
        'Musikengine laden
        MusikEngine.LoadDevice(Me.Handle)
        'Objekte erstellen
        Objektverwalter.IniVerwalter()
        Objektverwalter.Maus = New ObjektMaus()
        'Das Alphabet wird erstellt
        ObjektAlphabet.LoadAlphabete()
        Sprachconverter.LoadLanguage()
        'Texturen Laden
        TexturenHalter.LoadTexturen()
        TexturenHalter.LoadModusTexturen()


        Me.KarteLaden.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"

        Schrift = New Schriftengine()
        Ini(Formmodi.Hauptmenü)
        AlleFarbtabellen = New Color() _
        {Color.FromArgb(255, 255, 77, 0), Color.FromArgb(255, 31, 199, 255), Color.FromArgb(255, 0, 255, 0), Color.FromArgb(255, 255, 199, 0), Color.FromArgb(255, 181, 148, 140), _
         Color.FromArgb(255, 76, 109, 109), Color.FromArgb(255, 252, 141, 0), Color.FromArgb(255, 225, 113, 0), Color.FromArgb(255, 244, 0, 244), Color.FromArgb(255, 163, 191, 141), Color.FromArgb(255, 0, 213, 213), _
         Color.FromArgb(255, 148, 0, 211), Color.Blue, Color.Brown, Color.Green, Color.FromArgb(255, 185, 55, 136), Color.FromArgb(255, 103, 103, 103), Color.FromArgb(255, 204, 0, 204)}

        'For Each File In My.Computer.FileSystem.GetFiles("C:\Programmierung\Commander Wars\KOs")
        '    ObjektLadeklasse.ImportKOfromCW(File)
        'Next
        '  ObjektLadeklasse.ImportAWDorStandUnit("C:\Programmierung\Commander Wars\Custom Wars Dor\resources\res\plugin\dor\images\unit1s.png", "C:\Programmierung\Commander Wars\Programm\Commander Wars\Output\")

        'Dim S As Sprachen = My.Settings.Sprache
        'ObjektLadeklasse.TranslateIDInNameAndSave("C:\Programmierung\Commander Wars\Programm\Commander Wars\Output\" + S.ToString + ".txt")


        ErsterStart = False
        Dim OldSize As Size = New Size(Hauptmenü.MainMenü.MalPanel.Width, Hauptmenü.MainMenü.MalPanel.Height)
        Me.Size = New Size(0, 0)
        Me.Size = OldSize
        If Not frmSplashScreen.SplScreen Is Nothing Then
            Do While VideoKlasse.BeschäftigtAbspielen And (Not getTasteGedrückt(Keys.Enter))
                Threading.Thread.Sleep(100)
                ' My.Application.DoEvents()
            Loop
            VideoKlasse.Abbrechen()
            frmSplashScreen.SplScreen.Close()
        End If

        If Not My.Settings.Fenstermodus Then
            Me.Location = New Point
        End If

        'Fenstermodus?
        ChangeWindowMode()

        Hauptmenü.MainMenü.Visible = True
        Hauptmenü.MainMenü.Focus()
    End Sub
    Public Shared Sub BildschirmGrößeverändern(ByVal Breite As Integer, ByVal Höhe As Integer)
        If My.Settings.Fenstermodus Then
            My.Settings.BildschirmBreite = Breite - Rand.X
            My.Settings.BildschirmHöhe = Höhe - Rand.Y
        Else
            My.Settings.BildschirmBreite = Breite
            My.Settings.BildschirmHöhe = Höhe
        End If
        My.Settings.StandardVollbildschirmBreite = My.Computer.Screen.Bounds.Width
        My.Settings.StandardVollbildschirmHöhe = My.Computer.Screen.Bounds.Height
        Dim Verhältnis As Single = My.Settings.BildschirmBreite / My.Settings.BildschirmHöhe
        Dim Eineindrittel As Single = 1 + 1 / 3
        If Verhältnis = Breitbild Then
            My.Settings.Verhältnis = Breitbild
            My.Settings.Streckfaktor = My.Settings.BildschirmBreite / 1280
        ElseIf Verhältnis = Eineindrittel Then
            My.Settings.Verhältnis = Eineindrittel
            My.Settings.Streckfaktor = My.Settings.BildschirmBreite / 800
        Else
            My.Settings.Verhältnis = Eineindrittel
            My.Settings.Streckfaktor = 1
        End If
        My.Settings.Save()
    End Sub
    Public Shared Sub Ini(ByVal Modus As Formmodi, Optional ByVal Spielstand As Boolean = False, Optional ByVal SpielfeldNichtLöschen As Boolean = False)
        If Modus = Formmodi.SiegMenü Then
            IniSiegMenü()
            Exit Sub
        End If
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Pause = True
        ObjektMaus.Zustand = ObjektMaus.Zustände.Menü
        Reset()
        Formmodus = Modus
        Objektverwalter.Reset(SpielfeldNichtLöschen)
        ObjektMaus.Visible = True
        Select Case Modus
            Case Formmodi.Hauptmenü
                Objektverwalter.Menü = New ObjektHauptmenü()
            Case Formmodi.Editor
                Objektverwalter.Menü = New ObjektKarteneditormenü()
            Case Formmodi.Spiel

                If Spielstand = True Then
                    Objektverwalter.Menü = New ObjektSpielMenü(Spielstand, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
                    Objektverwalter.Spielfeld.SpielWiederaufnehmen()
                Else

                    If TypeOf Objektverwalter.Menü Is ObjektKartenauswahlMenü Then
                        Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
                        Objektverwalter.Menü = New ObjektSpielMenü(Spielstand, M.StartSpieler)
                    ElseIf TypeOf Objektverwalter.Menü Is ObjektKartenauswahlLandkartenMenü Then
                        Dim M As ObjektKartenauswahlLandkartenMenü = Objektverwalter.Menü
                        Objektverwalter.Menü = New ObjektSpielMenü(Spielstand, M.StartSpieler)
                    ElseIf TypeOf Objektverwalter.Menü Is ObjektHauptmenü Then
                        Objektverwalter.Menü = New ObjektSpielMenü(Spielstand, )
                    End If
                    'Jetzt muss evtl. z. Bsp. die KI gestartet werden.
                End If
            Case Formmodi.Kartenauswahl
                Objektverwalter.Menü = New ObjektKartenauswahlMenü
            Case Formmodi.KartenauswahlMP
                Objektverwalter.Menü = New ObjektNetzwerkMenü
            Case Formmodi.Optionen
                Objektverwalter.Menü = New ObjektOptionsMenü
            Case Formmodi.Credits
                Objektverwalter.Menü = New ObjektCreditMenü("MainCredits")
            Case Formmodi.KOZufallMenü
                Objektverwalter.Menü = New ObjektKORandomMenü
            Case Formmodi.EinheitenAuswahlMenü
                Objektverwalter.Menü = New ObjektUnitSelectMenu
        End Select
        Objektverwalter.Menü.IniMenü()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufällig()
        SprachReload(Modus)
        Hauptmenü.MainMenü.UpdateStart.Start()
    End Sub
    Public Shared Sub IniLandkartenMenü(ByVal Pfad As String, ByVal ErsterStart As Boolean)
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Pause = True
        ObjektMaus.Zustand = ObjektMaus.Zustände.Menü

        Reset()
        Formmodus = Formmodi.LandkartenAuswahlKAMP
        Objektverwalter.Reset(False)
        ObjektMaus.Visible = True
        If ErsterStart = True Then
            Objektverwalter.Menü = New ObjektKartenauswahlLandkartenMenü(Pfad)
        Else
            'Jetzt müsst zuerst das Objekt erstellt werden.


        End If
        Objektverwalter.Menü.IniMenü()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufällig()
        SprachReload(Formmodi.LandkartenAuswahlKAMP)
        Hauptmenü.MainMenü.UpdateStart.Start()

    End Sub
    Public Shared Sub IniLandkartenMenü(ByVal LandkartenInfo As ObjektLandkartenInfos)
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Pause = True
        ObjektMaus.Zustand = ObjektMaus.Zustände.Menü
        Reset()
        Formmodus = Formmodi.LandkartenAuswahlKAMP
        Objektverwalter.Reset(False)
        ObjektMaus.Visible = True
        Objektverwalter.Menü = New ObjektKartenauswahlLandkartenMenü(LandkartenInfo)
        Objektverwalter.Menü.IniMenü()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufällig()
        SprachReload(Formmodi.LandkartenAuswahlKAMP)
        Hauptmenü.MainMenü.UpdateStart.Start()

    End Sub
    Public Shared Sub IniSiegMenü()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Spielfeld.EingabenErlauben = False
        End If
        Pause = True
        ObjektMaus.Zustand = ObjektMaus.Zustände.Menü
        Reset()
        Formmodus = Formmodi.SiegMenü

        ObjektMaus.Visible = True
        Dim Farben(Objektverwalter.Spielfeld.Spieler.Length - 2) As Color
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            Farben(I - 1) = Objektverwalter.Spielfeld.Spieler(I).Farbe
        Next
        Dim LetzterSpieler As Integer = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(I)
            If Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen(Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(I - 1, 0) Is Nothing Then
                Objektverwalter.Spielfeld.Aufzeichnung.UpdateAufzeichnungen(True, True)
            End If
            If Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen(Objektverwalter.Spielfeld.Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(I - 1, 1) Is Nothing Then
                Objektverwalter.Spielfeld.Aufzeichnung.UpdateAufzeichnungen(False, True)
            End If
        Next
        Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(LetzterSpieler)
        Objektverwalter.Menü = New ObjektSiegMenü(Objektverwalter.Spielfeld.Aufzeichnung, Farben, Objektverwalter.Spielfeld.ObjektLandkartenInfo, Objektverwalter.Spielfeld.NächsteKarte, Objektverwalter.Spielfeld.Spieler)

        Objektverwalter.Reset(False)
        Objektverwalter.Menü.IniMenü()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            Objektverwalter.Zentrieren()
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        MusikZufällig()
        SprachReload(Formmodi.SiegMenü)
        Hauptmenü.MainMenü.UpdateStart.Start()

    End Sub
    Public Shared Function Farbtabelleerstellen(ByVal StartFarbe As Color) As Image
        Dim B As New Bitmap(12, 1, Imaging.PixelFormat.Format24bppRgb)
        Dim B2 As New Bitmap(1, 1, Imaging.PixelFormat.Format24bppRgb)
        B2.SetPixel(0, 0, StartFarbe)
        Dim B3 As Bitmap = Grafikengine.Helligkeitverändern(B2, -0.25)
        B.SetPixel(0, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, -0.15)
        B.SetPixel(1, 0, B3.GetPixel(0, 0))
        B.SetPixel(2, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, 0.3)
        B.SetPixel(3, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, 0.5)
        B.SetPixel(4, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, -0.4)
        B.SetPixel(5, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, -0.3)
        B.SetPixel(6, 0, B3.GetPixel(0, 0))
        B.SetPixel(7, 0, StartFarbe)
        B3 = Grafikengine.Helligkeitverändern(B2, 0.3)
        B.SetPixel(8, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, 0.4)
        B.SetPixel(9, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, -0.1)
        B.SetPixel(10, 0, B3.GetPixel(0, 0))
        B3 = Grafikengine.Helligkeitverändern(B2, -0.05)
        B.SetPixel(11, 0, B3.GetPixel(0, 0))
        'Momentan speichern wir die Farbtabelle nicht ab.
        '  B.Save(My.Settings.Resourcenpfad + "Farbtabellen\" + StartFarbe.ToString + ".bmp")
        Return B
    End Function
#End Region
#Region "Musik"
    'Musik
    ''' <summary>
    ''' Wählt per Zufall ein neues Musikstück aus und spielt es ab.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub MusikZufällig()
        'Dim Pfad As String = My.Settings.Resourcenpfad + "Musik\" + Formmodus.ToString
        'Pfad = Musikauswählen(Pfad)

        Dim Pfad As String = My.Settings.Resourcenpfad + "Musik\"
        Dim ListeGesamt As System.Collections.ObjectModel.ReadOnlyCollection(Of String)
        Dim Liste() As String = {}
        If Not Formmodus = Formmodi.Spiel Then
            Pfad += Formmodus.ToString + "\"
            If My.Computer.FileSystem.DirectoryExists(Pfad) Then 'Die Sicherheitsabfrage ist dringend nötig, so oft wie wir da schon rausgeflogen sind... außerdem, der Fehler kommt immer wieder, weil es immer wieder neue Menüs gibt ;) Hiermit beseitige ich also schon zukünftige Fehler cool nich?
                ListeGesamt = My.Computer.FileSystem.GetFiles(Pfad)
                For Each Musik In ListeGesamt
                    Array.Resize(Liste, Liste.Length + 1)
                    Liste(Liste.Length - 1) = Musik
                Next
            End If
        Else
            Pfad += "KO's\"
            ReDim Liste(0)
            If TypeOf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0) Is KOCustom And Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                Liste(0) = My.Settings.Resourcenpfad + "!Custom\CO\CO Music\" + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Musik + ".mp3"
                If Not My.Computer.FileSystem.FileExists(Liste(0)) Then
                    Liste(0) = Pfad + "Andy.mp3"
                End If
            Else
                If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                    Liste(0) = Pfad + Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Musik + ".mp3"
                    If My.Computer.FileSystem.FileExists(Liste(0)) = False Then
                        Liste(0) = Pfad + "Andy.mp3"
                    End If
                ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Gabe Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.MA.ToString Then
                        Liste(0) = Pfad + "BH Gabe" + ".mp3"
                    Else
                        Liste(0) = Pfad + "Gabe" + ".mp3"
                    End If
                ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Spezialgabe Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.MA.ToString Then
                        Liste(0) = Pfad + "BH Spezialgabe" + ".mp3"
                    Else
                        Liste(0) = Pfad + "Spezialgabe" + ".mp3"
                    End If
                ElseIf Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Doppelgabe Then
                    If Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.BH.ToString Or Objektverwalter.Spielfeld.AktuellerSpieler.Armee = Armeen.MA.ToString Then
                        Liste(0) = Pfad + "BH Doppelgabe" + ".mp3"
                    Else
                        Liste(0) = Pfad + "Doppelgabe" + ".mp3"
                    End If
                End If
            End If
        End If
        If Liste.Length > 0 Then
            Pfad = Liste(Zufallszahl(0, Liste.Length - 1))
            MusikEngine.LoadMusik(Pfad)
        End If
    End Sub
    Private Shared Function Musikauswählen(ByVal Pfad As String) As String
        Select Case Formmodus
            Case Formmodi.Hauptmenü
                'Der maximal Wert muss je nach Anzahl der Stücke noch geändert werden
                Return Pfad + "_" + Zufallszahl(0, 1).ToString + ".mid"
            Case Formmodi.Optionen
                'Der maximal Wert muss je nach Anzahl der Stücke noch geändert werden
                Return Pfad + "_" + Zufallszahl(0, 1).ToString + ".mid"
            Case Formmodi.Spiel
                'Beim Spiel wird es etwas komplizierter

            Case Formmodi.Editor
                'Der maximal Wert muss je nach Anzahl der Stücke noch geändert werden
                Return Pfad + "_" + Zufallszahl(0, 0).ToString + ".mid"
        End Select
        Return Pfad
    End Function
    Public Shared Sub MusikauswählenCustom(ByVal Pfad As String)
        If Pfad.ToLower.Trim = "default" Then
            MusikZufällig()
        End If

        Pfad = Pfad.ToLower.Trim
        Dim Datei As String = ""
        If Pfad(1) = ":" Then
            'Ein absoluter Pfad, das ist zwar eigentlich nicht gut, aber mal schauen, ob wir dort musik finden..
            If My.Computer.FileSystem.FileExists(Pfad) Then
                Datei = Pfad
            End If
        Else
            If Pfad.StartsWith("\Resources\".ToLower) Or Pfad.StartsWith("Resources\".ToLower) Then
                'Ein pfad relativ zu den resourcen.
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + Pfad.Replace("\Resources\".ToLower, "").Replace("Resources\".ToLower, "")) Then
                    Datei = My.Settings.Resourcenpfad + Pfad.Replace("\Resources\".ToLower, "").Replace("Resources\".ToLower, "")
                End If
            Else
                'ich nehme an die musik befindet sich ordnungsgemäß..
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "!Custom\Music\" + Pfad) Then
                    Datei = My.Settings.Resourcenpfad + "!Custom\Music\" + Pfad
                Else
                    'Die datei gibt es nicht....
                    If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + Pfad) Then
                        'nur falsch eingeordnet, aber immerhin gibt es überhaupt etwas zu hören.
                        Datei = My.Settings.Resourcenpfad + Pfad
                    Else
                        Console.WriteLine("konnte folgende Musik nicht finden: " + Pfad)
                    End If
                End If
            End If
        End If
        If Not Datei = "" Then
            'Es wurde also schlussendlich etwas gefunden, was nun abgespielt werden kann.
            MusikEngine.LoadMusik(Datei)
        End If
    End Sub

#End Region
#Region "Update"
    Public Shared Scrollen As Boolean = False
    Public Shared ScrollenKameraKippen As Boolean = False
    Public Shared ScrollenX, ScrollenY As Integer
    Public Shared Rechteck As Rectangle
    Public Shared Pause As Boolean = False
    Shared FPSS As Integer
    Shared FPSN As Integer
    Shared FPS As Integer
    Shared FrameTicks As Long
    Shared Frame As Integer = 0

    Private Sub UpdateStart_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UpdateStart.Tick
        UpdateStart.Stop()
        If ErsterStart = True Then Spielladen()
        If Pause = True Then
            Pause = False
            Updateframe()
        End If
    End Sub
    Public Shared Sub Updateframe()
        Do While Pause = False
            'Frames per Second
            While VideoKlasse.Beschäftigt
                Threading.Thread.Sleep(100)
                My.Application.DoEvents()
                Objekt2D.AlreadyKlickt = False
            End While

            If MusikAnhalten = True Then
                MusikEngine.MusikStop()
                MusikAnhalten = False
            End If
            If MusikEngine.MusikStopped Or MusikEngine.MusikEnded Then
                MusikZufällig()
            End If
            Dim Ticks As Long = Now.Ticks
            Dim FT2 As Long = FrameTicks + CLng(TimeSpan.TicksPerSecond / My.Settings.SpielGeschwindigkeit)
            If FT2 > Ticks Then
                'Wir führen alles in der momentanen Schleife aus
                My.Application.DoEvents()
                Objekt2D.AlreadyKlickt = False
                Continue Do
            Else
                FrameTicks = Now.Ticks
                'My.Settings.BilderProSekunde = 20
                'My.Settings.Save()
            End If
            'Hier wird ja abgearbeitet, wenn wir geklickt haben oder eine Taste gedrückt.
            'Da ich noch das MultiThreadingproblem habe mit dem Netzwerk. Prüfe ich hier nochmal ein paar sachen ab.
            If NetzConnected Then 'Andernfalls können wir ganz normal weiterspielen :)
                If TypeOf Objektverwalter.Menü Is ObjektNetzwerkMenü Then
                    Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
                    M.PrüfenWeiter()
                    M.Spielstartprüfen()
                End If
            End If

            'FPS errechnen
            If FPSS = Now.Second Then
                FPSN += 1
            Else
                FPS = FPSN
                FPSN = 0
                FPSS = Now.Second
            End If
            'Musikengine Wav Update
            MusikEngine.FrameMusik()
            'Zuerst überprüfen wir ob wir gewonnen haben
            If Formmodus = Formmodi.Spiel Then
                If Objektverwalter.Spielfeld.Regeln.Spielende = True Then
                    Objektverwalter.Spielfeld.Aufzeichnung.UpdateAufzeichnungen(False)
                    'Gewonnen, oder nur Runde vorbei?
                    'Script prüfen
                    ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
                    Dim M As ObjektSpielMenü = Objektverwalter.Menü
                    If M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts Then
                        If Not Objektverwalter.Spielfeld.KI Is Nothing Then
                            Objektverwalter.Spielfeld.KI.KIThreat.Abort()
                            Objektverwalter.Spielfeld.KI = Nothing
                        End If
                        ObjektMaus.Visible = True
                        Dim S As ObjektSpielMenü = Objektverwalter.Menü
                        S.Dispose()
                    End If
                End If
            End If
            'Wir legen die Mauskoordinaten fest

            'Einige Formen haben bestimmte Events diese werden jetzt ausgeführt
            If Not Objektverwalter.Menü Is Nothing Then Objektverwalter.Menü.Frame()
            Frame += 1
            If IsNothing(Objektverwalter.Spielfeld) = False Then
                If Objektverwalter.Spielfeld.LaufenLöschen = True Then
                    If Not Objektverwalter.Spielfeld.Laufen Is Nothing Then
                        SyncLock Objektverwalter.Spielfeld.Laufen
                            Objektverwalter.Spielfeld.Laufen = Nothing
                        End SyncLock
                    End If
                    Objektverwalter.Spielfeld.LaufenLöschen = False
                End If
                If IsNothing(Objektverwalter.Spielfeld.Laufen) = False Then
                    'Es wird öfter gelaufen als Bilder Geupdatet
                    If Objektverwalter.Spielfeld.Laufen.Laufen = True Then
                        'Die Einheit hat ihr Ziel erreicht
                        'wir lassen ein Menü erscheinen
                        If Objektverwalter.Spielfeld.Laufen.Zielerreicht = False Then
                            If Objektverwalter.Spielfeld.Laufen.Falle = True Then
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                    'Hier komm jetzt noch ein Pfeil mit der Schrift Falle It's a trap
                                    Objektverwalter.NeuObjektAnimation(Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y, "Falle", "Falle")
                                    Objektverwalter.Spielfeld.Laufen.Zielerreicht = True
                                    If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).FallenAngriff = True Then
                                        If Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).IsInKOZone(Objektverwalter.Spielfeld.AktuelleEinheit) Then
                                            Dim Gegner As Point = Objektverwalter.Spielfeld.Laufen.GetNextFeld
                                            If Objektverwalter.KannAngreifen(Gegner.X, Gegner.Y, Objektverwalter.Spielfeld.Laufen.Position.X, Objektverwalter.Spielfeld.Laufen.Position.Y, False, Objektverwalter.Spielfeld.AktuelleEinheit.GetMap) = True Then
                                                Objektverwalter.Angriff(Objektverwalter.Spielfeld.AktuelleEinheit, Gegner.X, Gegner.Y)
                                            Else
                                                Objektverwalter.Warten()
                                            End If
                                        Else
                                            Objektverwalter.Warten()
                                        End If
                                    Else
                                        Objektverwalter.Warten()
                                    End If
                                Else
                                    'Wir sind auch in eine Falle gelaufen damn ist
                                    'Zum Glück bekommt das niemand mit.
                                    Objektverwalter.Warten()
                                End If
                            Else
                                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                    Objektverwalter.Spielfeld.Laufen.Zielerreicht = True
                                    Objektverwalter.Befehlsmenüerschaffen()
                                Else
                                    Objektverwalter.Spielfeld.Laufen.Zielerreicht = True
                                    '  Objektverwalter.Spielfeld.KI.KISchleifeZiehen()
                                End If
                            End If
                        End If
                    End If
                End If
            End If
            If Frame >= 3 Then
                Frame = 0
                FramesAktualisieren()
            End If
            'Wir zeichnen das neue Bild
            If Grafikengine.Updateframe = False Then
                Engineladen()
            End If


            My.Application.DoEvents()
            Objekt2D.AlreadyKlickt = False
        Loop
    End Sub
    Public Shared Sub Engineladen()

    End Sub
    Public Shared Sub SpielfeldScrollen()
        'Hier wird gescrollt bis ins unendliche
        If Hauptmenü.ScrollenKameraKippen Then
            If Objektverwalter.Spielfeld IsNot Nothing Then
                With Objektverwalter.Spielfeld
                    Dim deltaX As Integer = ObjektMaus.XKoordinate - Hauptmenü.ScrollenX
                    Dim deltaY As Integer = ObjektMaus.YKoordinate - Hauptmenü.ScrollenY
                    'Dim Alpha As Double = Math.Atan(.KameraRichtung.Z / .KameraRichtung.X)
                    ' .KameraRichtung = New Microsoft.DirectX.Vector3(.KameraRichtung.X, -100, Math.Tan((Alpha * Math.PI / 180 + deltaX) * 180 / Math.PI) * .KameraRichtung.X)
                    .KameraRichtung += deltaX / 100
                    .KameraVerhältnisWeite += deltaY / 100

                    'System.Windows.Forms.Cursor.Position = New Point(Hauptmenü.ScrollenX, Hauptmenü.ScrollenY) + Hauptmenü.MainMenü.Location
                    Hauptmenü.ScrollenX = ObjektMaus.XKoordinate
                    Hauptmenü.ScrollenY = ObjektMaus.YKoordinate
                End With
            End If
        End If
        If Hauptmenü.Scrollen = True Then
            If My.Settings.draw3D Then
                Dim deltaX As Integer = ObjektMaus.XKoordinate - Hauptmenü.ScrollenX
                Dim deltaY As Integer = ObjektMaus.YKoordinate - Hauptmenü.ScrollenY
                Hauptmenü.ScrollenX = ObjektMaus.XKoordinate
                Hauptmenü.ScrollenY = ObjektMaus.YKoordinate
                With Objektverwalter.Spielfeld
                    Dim Richtungsvector As New Vector3(-Math.Sin(.KameraRichtung), 0, -Math.Cos(.KameraRichtung))
                    .KameraTarget = Vector3.Add(.KameraTarget, Vector3.Multiply(Richtungsvector, deltaY / 70))
                    .KameraTarget = Vector3.Add(.KameraTarget, Vector3.Multiply(Vector3.Cross(Richtungsvector, New Vector3(0, 1, 0)), deltaX / 100))
                End With

                ' Objektverwalter.Spielfeld.KameraTarget = New Microsoft.DirectX.Vector3(Objektverwalter.Spielfeld.KameraTarget.X + deltaX / 100, 0, Objektverwalter.Spielfeld.KameraTarget.Z + deltaY / 100)
            Else
                Hauptmenü.Scroller(ObjektMaus.XKoordinate - Hauptmenü.ScrollenX, ObjektMaus.YKoordinate - Hauptmenü.ScrollenY)
                If Objektverwalter.Spielfeld.KI Is Nothing Then
                    System.Windows.Forms.Cursor.Position = New Point(Hauptmenü.ScrollenX, Hauptmenü.ScrollenY) + Hauptmenü.MainMenü.Location + Rand
                End If
                ObjektMaus.XKoordinate = Hauptmenü.ScrollenX
                ObjektMaus.YKoordinate = Hauptmenü.ScrollenY
            End If
        End If
    End Sub

    Public Shared Sub Scroller(ByVal X As Integer, ByVal Y As Integer)
        If X < 10 And X > -10 And Y < 10 And Y > -10 Then
            Exit Sub
        End If
        Dim AdditionX As Integer = 1
        If X < 0 Then
            X = X * -1
            AdditionX = -1
        End If
        Dim AdditionY As Integer = 1
        If Y < 0 Then
            Y = Y * -1
            AdditionY = -1
        End If
        Dim Xneu As Integer = Objektverwalter.Spielfeld.BildschirmKooX
        Dim Yneu As Integer = Objektverwalter.Spielfeld.BildschirmKooY
        'Dann schauen wir wie weit wir scrollen können
        For I = 1 To X
            If Not Xneu + AdditionX * My.Settings.ScrollEmpfindlichkeit * My.Settings.MausUmkehren > Rechteck.X + Hauptmenü.MainMenü.MalPanel.Width - Hauptmenü.Feldbreite And Xneu + AdditionX * My.Settings.ScrollEmpfindlichkeit * My.Settings.MausUmkehren + Hauptmenü.MainMenü.MalPanel.Width - 2 * Hauptmenü.Feldbreite > (Objektverwalter.Spielfeld.Breite + 1) * (Feldbreite) * -1 + Hauptmenü.MainMenü.MalPanel.Width - (Hauptmenü.MainMenü.MalPanel.Width - Rechteck.Width) + Hauptmenü.Feldbreite + Rechteck.X Then
                Xneu += AdditionX * My.Settings.ScrollEmpfindlichkeit * My.Settings.MausUmkehren
            Else
                Exit For
            End If
        Next
        For I2 = 1 To Y
            If Not Yneu + AdditionY * My.Settings.ScrollEmpfindlichkeit * My.Settings.MausUmkehren > Rechteck.Y + Hauptmenü.MainMenü.MalPanel.Height - Hauptmenü.Feldbreite And Yneu + AdditionY * My.Settings.ScrollEmpfindlichkeit * My.Settings.MausUmkehren + Hauptmenü.MainMenü.MalPanel.Height - 2 * Hauptmenü.Feldbreite > (Objektverwalter.Spielfeld.Höhe + 1) * (Feldbreite) * -1 + Hauptmenü.MainMenü.MalPanel.Height - (Hauptmenü.MainMenü.MalPanel.Height - Rechteck.Height) + Hauptmenü.Feldbreite + Rechteck.Y Then
                Yneu += AdditionY * My.Settings.ScrollEmpfindlichkeit * My.Settings.MausUmkehren
            Else
                Exit For
            End If
        Next
        'Jetzt wird gescrollt
        Objektverwalter.Spielfeld.BildschirmKooX = Xneu
        Objektverwalter.Spielfeld.BildschirmKooY = Yneu
    End Sub
    Private Shared Sub FramesSpielfeldAktualisieren()
        Dim AnzahlSchlachten As Integer = 0
        ObjektLandschaft.Frame = 1
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        Objektverwalter.Spielfeld.Einheiten(X, Y, I).Frame = 1
                    End If
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                        Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Frame = 1
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Aktualiesiert alle Bilder die sich bewegen
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared Sub FramesAktualisieren()
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            CursorSetzen(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate)
            Objektverwalter.Spielfeld.Frame = 1
            Objektverwalter.Spielfeld.Wetterframe = 1
            FramesSpielfeldAktualisieren()
        End If
        ObjektMaus.Frame = 1
        Objektverwalter.FrameMarkierteFelder = 1
    End Sub
    Private Shared Sub CursorSetzen(ByVal X As Integer, ByVal Y As Integer)
        SetSpielfeldpunkt(X, Y)
        Select Case Formmodus
            Case Formmodi.Hauptmenü
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
            Case Formmodi.Kartenauswahl
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
            Case Formmodi.KartenauswahlMP
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
            Case Formmodi.Editor
                Objektverwalter.Menü.SetMausBild()
                If ObjektMaus.Zustand > 0 Then
                    X = SpielfeldPunkt.X * Feldbreite
                    Y = SpielfeldPunkt.Y * Feldbreite
                    ObjektMaus.XKoordinate = X + Objektverwalter.Spielfeld.BildschirmKooX
                    ObjektMaus.YKoordinate = Y + Objektverwalter.Spielfeld.BildschirmKooY
                Else
                    ObjektMaus.XKoordinate = X
                    ObjektMaus.YKoordinate = Y
                End If
            Case Formmodi.Optionen
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
            Case Formmodi.LandkartenAuswahlKAMP
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
            Case Formmodi.Spiel
                'Vorläufig
                If My.Settings.draw3D = False Then
                    If Rechteck.Contains(X, Y) = True Then
                        X = SpielfeldPunkt.X * Feldbreite
                        Y = SpielfeldPunkt.Y * Feldbreite
                        ObjektMaus.XKoordinate = X + Objektverwalter.Spielfeld.BildschirmKooX
                        ObjektMaus.YKoordinate = Y + Objektverwalter.Spielfeld.BildschirmKooY
                        Objektverwalter.Menü.SetMausBild()
                    Else
                        ObjektMaus.XKoordinate = X
                        ObjektMaus.YKoordinate = Y
                    End If
                Else
                    ObjektMaus.XKoordinate = X
                    ObjektMaus.YKoordinate = Y
                End If
                'Jetzt schauen wir ob wir die KOAnzeige spiegeln müssen
                If Rechteck.Y + 200 >= ObjektMaus.YKoordinate Then
                    If Objektverwalter.Spielfeld.KOAnzeigen.GespiegeltGemalt = False Then
                        If Rechteck.X + 200 >= ObjektMaus.XKoordinate Then
                            Objektverwalter.Spielfeld.KOAnzeigen.Spiegeln(Rechteck.X + Rechteck.Width)
                        End If
                    Else
                        If Rechteck.X + Rechteck.Width - 200 <= ObjektMaus.XKoordinate Then
                            Objektverwalter.Spielfeld.KOAnzeigen.Spiegeln(Rechteck.X)
                        End If
                    End If
                End If
                'If Rechteck.Y + Rechteck.Height - 200 <= ObjektMaus.YKoordinate Then
                '    If Objektverwalter.Spielfeld.InfoAnzeige.GespiegeltGemalt = False Then
                '        If Rechteck.X + 200 >= ObjektMaus.XKoordinate Then
                '            Objektverwalter.Spielfeld.InfoAnzeige.Spiegeln(Rechteck.X + Rechteck.Width)
                '        End If
                '    Else
                '        If Rechteck.X + Rechteck.Width - 200 <= ObjektMaus.XKoordinate Then
                '            Objektverwalter.Spielfeld.InfoAnzeige.Spiegeln(Rechteck.X)
                '        End If
                '    End If
                'End If
            Case Formmodi.SiegMenü
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
            Case Else
                ObjektMaus.XKoordinate = X
                ObjektMaus.YKoordinate = Y
        End Select
    End Sub
    Public Shared Sub SetSpielfeldpunkt(ByVal X As Integer, ByVal Y As Integer)
        Dim P As Point = SpielfeldPunkt
        If My.Settings.draw3D Then
            'So bei 3D, sieht das aber anders aus!
            If Objektverwalter.Spielfeld Is Nothing Then
                X = 0
                Y = 0
            Else
                'With Objektverwalter.Spielfeld
                '    Dim V As Vector3
                '    V.Unproject(Grafikengine.Grafikkarte.Viewport, Grafikengine.Grafikkarte.Transform.Projection, Grafikengine.Grafikkarte.Transform.View, Grafikengine.Grafikkarte.Transform.World)
                'End With
                P = Grafikengine.Intersect(X, Y)
                X = P.X
                Y = P.Y
            End If
            Grafikengine.setLichtPos(New Vector3(X, 2, -Y))
        Else
            '2D:
            If IsNothing(Objektverwalter.Spielfeld) = False Then
                X -= Objektverwalter.Spielfeld.BildschirmKooX
                Y -= Objektverwalter.Spielfeld.BildschirmKooY
            End If
            X = X / Feldbreite
            Y = Y / Feldbreite
        End If
        SpielfeldPunkt = New Point(X, Y)
        If Formmodus = Formmodi.Spiel Then
            Dim M As ObjektSpielMenü = Objektverwalter.Menü
            'Wir sorgen dafür das der Cursor auf dem Bildschirm bleibt
            If M.Spielmodus <> ObjektSpielMenü.Spielmodi.AuswahlmenüEinheit And Not Debbuging Then
                Dim Changed As Boolean = False
                If SpielfeldPunkt.X < 0 Then
                    Changed = True
                    SpielfeldPunkt.X = 0
                End If
                If SpielfeldPunkt.X > Objektverwalter.Spielfeld.Breite - 1 Then
                    Changed = True
                    SpielfeldPunkt.X = Objektverwalter.Spielfeld.Breite - 1
                End If
                If SpielfeldPunkt.Y < 0 Then
                    Changed = True
                    SpielfeldPunkt.Y = 0
                End If
                If SpielfeldPunkt.Y > Objektverwalter.Spielfeld.Höhe - 1 Then
                    Changed = True
                    SpielfeldPunkt.Y = Objektverwalter.Spielfeld.Höhe - 1
                End If
                If Changed Then
                    CursorPlazieren(SpielfeldPunkt.X * Feldbreite, SpielfeldPunkt.Y * Feldbreite)
                End If
            End If
            If M.Spielmodus = ObjektSpielMenü.Spielmodi.Abzug Or M.Spielmodus = ObjektSpielMenü.Spielmodi.Einheitausgewählt Or M.Spielmodus = ObjektSpielMenü.Spielmodi.FeuerradiusAnzeigen Or M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts Then
                If Not P.X = SpielfeldPunkt.X Then
                    If Rechteck.Contains(SpielfeldPunkt.X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, SpielfeldPunkt.Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY) Then
                        '  My.Computer.Audio.Play(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", AudioPlayMode.Background)
                    End If
                ElseIf Not P.Y = SpielfeldPunkt.Y Then
                    If Rechteck.Contains(SpielfeldPunkt.X * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooX, SpielfeldPunkt.Y * Hauptmenü.Feldbreite + Objektverwalter.Spielfeld.BildschirmKooY) Then
                        ' My.Computer.Audio.Play(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", AudioPlayMode.Background)
                    End If
                End If
            End If
            M.SPSchadenAnzeigen()
        End If
    End Sub
#End Region
#Region "Formevents"
    Public Shared Sub Reset()
        'Kartenauswahl wird auf Null gesetzt
        Rechteck = New Rectangle(0, 0, Hauptmenü.MainMenü.MalPanel.Width, Hauptmenü.MainMenü.MalPanel.Height)
        If Not Objektverwalter.Menü Is Nothing Then
            Objektverwalter.Menü.Reset()
        End If
        Objekt2D.Reset()
    End Sub
    Private Shared Sub Hauptmenü_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Pause = True
        If Hauptmenü.AufzeichnungAktiv Then
            AufzeichnungAbspielenThreadBeenden()
        End If
        'Netzwerk schließen!
        If NetzConnection IsNot Nothing Then
            NetzConnection.Dispose()
        End If
        If NetzDeviceAddress IsNot Nothing Then
            NetzDeviceAddress.Dispose()
        End If
        MusikEngine.Dispose()
        'Ini Speichern.
        frmSplashScreen.MySettingsIniSave()
    End Sub
    Private Sub Hauptmenü_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
        Select Case e.KeyCode
            Case Keys.Enter
                VideoKlasse.Abbrechen()
            Case Keys.LWin
                ' Console.WriteLine("Da braucht er mal nen Break")

            Case Keys.F7
                ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).KOID, "Puh, ist das heiß hier!", Objektverwalter.Spielfeld.AktuellerSpieler.Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Traurig)})
        End Select
        If Not Objektverwalter.Menü Is Nothing Then Objektverwalter.Menü.KeyDown(sender, e)
        'Console.WriteLine("In der Textbox steht: " + txtTextBox.text)
    End Sub

    Private Shared Sub Hauptmenü_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MalPanel.MouseDown
        If Not Objektverwalter.Menü Is Nothing Then Objektverwalter.Menü.MouseDown(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
    End Sub

    Private Sub MalPanel_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles MalPanel.MouseEnter
        Cursor.Hide()
    End Sub
    Private Sub MalPanel_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles MalPanel.MouseLeave
        Cursor.Show()
    End Sub
    Private Shared Sub Hauptmenü_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MalPanel.MouseMove
        CursorSetzen(e.X, e.Y)
        If Not Objektverwalter.Menü Is Nothing Then Objektverwalter.Menü.MouseMove(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
    End Sub
    Private Shared Sub Hauptmenü_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MalPanel.MouseUp
        If Not Objektverwalter.Menü Is Nothing Then Objektverwalter.Menü.MouseUp(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
    End Sub
    Private Shared Sub Hauptmenü_MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
        If Not Objektverwalter.Menü Is Nothing Then Objektverwalter.Menü.MouseWheel(sender, New System.Windows.Forms.MouseEventArgs(e.Button, e.Clicks, e.X, e.Y, e.Delta))
    End Sub
    Public Shared Sub CursorPlazieren(ByVal P As Point)
        CursorPlazieren(P.X, P.Y)
    End Sub
    Public Shared Sub CursorPlazieren(ByVal X As Integer, ByVal Y As Integer)
        X += Objektverwalter.Spielfeld.BildschirmKooX + Rand.X : Y += Objektverwalter.Spielfeld.BildschirmKooY + Rand.Y
        If Objektverwalter.Spielfeld.KI Is Nothing Then
            Windows.Forms.Cursor.Position = New Point(X, Y) + Hauptmenü.MainMenü.Location
        End If
        ObjektMaus.XKoordinate = X
        ObjektMaus.YKoordinate = Y
        SetSpielfeldpunkt(X, Y)
        Objektverwalter.Menü.MouseMove(Nothing, New System.Windows.Forms.MouseEventArgs(Windows.Forms.MouseButtons.None, 0, ObjektMaus.XKoordinate, ObjektMaus.YKoordinate, 0))
    End Sub
    ''' <summary>
    ''' Die Fenster größe hat sich geändert 3D Engine anpassen.
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Hauptmenü_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged
        If Not ErsterStart Then 'Wir haben einen Device den man ändern kann.
            Dim OldSize As New Size(Hauptmenü.MainMenü.MalPanel.Width, Hauptmenü.MainMenü.MalPanel.Height)
            BildschirmGrößeverändern(Me.Size.Width, Me.Size.Height)
            Grafikengine.NeuLaden(Me.Size.Width, Me.Size.Height, Me.MalPanel, True)
            Rechteck.Width = Me.Size.Width - Rand.X
            Rechteck.Height = Me.Size.Height - Rand.Y
            Rechteck.X = 0
            Rechteck.Y = 0
            Dim NewSize As New Size(My.Settings.BildschirmBreite, My.Settings.BildschirmHöhe)
            NewSize = NewSize - OldSize
            If Not Objektverwalter.Menü Is Nothing Then
                Objektverwalter.Menü.ChangeWindowSize(New Point(NewSize.Width, NewSize.Height))
            End If
            If ObjektLadebildschirm.Ladebildschirm IsNot Nothing Then
                ObjektLadebildschirm.Ladebildschirm.ChangeWindowSize(New Point(NewSize.Width, NewSize.Height))
            End If
            ObjektKODialog.ChangeWindowSize(New Point(NewSize.Width, NewSize.Height))
            'Neue Werte speichern
            My.Settings.BildschirmBreite = Hauptmenü.Rechteck.Width
            My.Settings.BildschirmHöhe = Hauptmenü.Rechteck.Height
            My.Settings.Save()
        End If
    End Sub
    ''' <summary>
    ''' Wechselt vom FensterModus in den Vollbild und umgekehrt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub ChangeWindowMode()
        Hauptmenü.MainMenü.FormBorderStyle = Windows.Forms.FormBorderStyle.None
        If My.Settings.Fenstermodus Then
            My.Settings.BildschirmBreite = Hauptmenü.MainMenü.Size.Width
            My.Settings.BildschirmHöhe = Hauptmenü.MainMenü.Size.Height
            Dim NWSize As Size = Hauptmenü.MainMenü.Size
            My.Settings.Save()
            Hauptmenü.MainMenü.FormBorderStyle = ChangeFormBorderStyle()
            Grafikengine._presentParameter.DeviceWindow = Hauptmenü.MainMenü.MalPanel
            Rand.X = Hauptmenü.MainMenü.Size.Width - NWSize.Width
            Rand.Y = Hauptmenü.MainMenü.Size.Height - NWSize.Height
            Hauptmenü.MainMenü.Size = New Size
            Hauptmenü.MainMenü.Size = NWSize
        Else
            Hauptmenü.MainMenü.Location = New Point
            Hauptmenü.MainMenü.FormBorderStyle = ChangeFormBorderStyle()
            Grafikengine._presentParameter.DeviceWindow = Hauptmenü.MainMenü.MalPanel
            Rand.X = 0
            Rand.Y = 0
            My.Settings.BildschirmBreite = My.Computer.Screen.Bounds.Width
            My.Settings.BildschirmHöhe = My.Computer.Screen.Bounds.Height
            My.Settings.Save()
            Hauptmenü.MainMenü.Size = New Size
            Hauptmenü.MainMenü.Size = New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)
        End If
    End Sub
    Public Shared Function ChangeFormBorderStyle() As Windows.Forms.FormBorderStyle
        If My.Settings.Fenstermodus Then
            Return Windows.Forms.FormBorderStyle.Fixed3D
        Else
            Return Windows.Forms.FormBorderStyle.None
        End If
    End Function
    Public Shared Sub AktualisierenTaskbar()
        Select Case My.Settings.TaskAnzeigenModus
            Case TaskleistenAnzeige.Taskleiste
                MainMenü.NICommanderWars.Visible = False
                MainMenü.ShowInTaskbar = True
            Case TaskleistenAnzeige.TrayMenü
                MainMenü.NICommanderWars.Visible = True
                MainMenü.ShowInTaskbar = False
            Case TaskleistenAnzeige.Versteckt
                MainMenü.NICommanderWars.Visible = False
                MainMenü.ShowInTaskbar = False
        End Select
    End Sub
    Private Sub NICommanderWars_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles NICommanderWars.Click
        MainMenü.Activate()
        Visible = True
    End Sub
#End Region
#Region "Speichern und Laden"
    Public Shared Sub SpeichernUnterName()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.SpeichenUnter.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"
        Hauptmenü.MainMenü.SpeichenUnter.Title = Sprachconverter.Translate("Karte Speichern Unter")
        Hauptmenü.MainMenü.SpeichenUnter.Filter = "Commander Wars " + Sprachconverter.Translate("Karte") + "|*.map"
        If Not Objektverwalter.Spielfeld.Kartenname = "" Then
            Hauptmenü.MainMenü.SpeichenUnter.FileName = Objektverwalter.Spielfeld.Kartenname
        End If
        If Hauptmenü.MainMenü.SpeichenUnter.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim Name As String = Hauptmenü.MainMenü.SpeichenUnter.FileName
            Speichern(Name, , , True)
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    Public Shared Sub SpielstandSpeichern()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.SpeichenUnter.InitialDirectory = My.Settings.Resourcenpfad + "Spielstände\"
        Hauptmenü.MainMenü.SpeichenUnter.Title = Sprachconverter.Translate("Spielstand Speichern")
        Hauptmenü.MainMenü.SpeichenUnter.Filter = "Commander Wars " + Sprachconverter.Translate("Karte") + "|*.sav"
        If Not Objektverwalter.Spielfeld.Kartenname = "" Then
            Hauptmenü.MainMenü.SpeichenUnter.FileName = Objektverwalter.Spielfeld.Kartenname
        End If
        If Hauptmenü.MainMenü.SpeichenUnter.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim Name As String = Hauptmenü.MainMenü.SpeichenUnter.FileName
            If Name.LastIndexOf("\") >= 0 Then
                Name = Name.Remove(0, Name.LastIndexOf("\") + 1)
            End If
            If Name.IndexOf(".") >= 0 Then
                Name = Name.Remove(Name.IndexOf("."))
            End If
            Speichern(Name, ".sav")
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    Public Shared Sub KarteLadenEditor()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.KarteLaden.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"
        Hauptmenü.MainMenü.KarteLaden.Title = Sprachconverter.Translate("Karte laden")
        Hauptmenü.MainMenü.KarteLaden.Filter = "Commander Wars " + Sprachconverter.Translate("Karte") + "|*.map"
        If Hauptmenü.MainMenü.KarteLaden.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If Hauptmenü.MainMenü.KarteLaden.CheckFileExists Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = Hauptmenü.MainMenü.KarteLaden.FileName
                Dim Endung As String = "map"
                If Name.LastIndexOf("\") >= 0 Then
                    If Name.LastIndexOf(".") >= 0 Then
                        Laden(Name, True, "")
                    Else
                        Laden(Name, True)
                    End If
                Else
                    Laden(Name, False)
                End If
            End If
            Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    Public Shared Sub KarteLadenEditorausTXT()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.KarteLaden.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"
        Hauptmenü.MainMenü.KarteLaden.Title = Sprachconverter.Translate("Karte importieren")
        Hauptmenü.MainMenü.KarteLaden.Filter = "Commander Wars " + Sprachconverter.Translate("Karte") + "|*.txt"
        If Hauptmenü.MainMenü.KarteLaden.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If Hauptmenü.MainMenü.KarteLaden.CheckFileExists Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = Hauptmenü.MainMenü.KarteLaden.FileName
                Objektverwalter.Spielfeld = LoadMapOutOfTxt(Name, True, True, True)
                GenerateUnitIDs()
                Objektverwalter.ÜbergängeAktualiesieren()
                Objektverwalter.Zentrieren()
            End If
            Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    ''' <summary>
    ''' Importiert eine ausgewählte AW DS Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub KarteLadenEditorausAWSMap()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.KarteLaden.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"
        Hauptmenü.MainMenü.KarteLaden.Title = Sprachconverter.Translate("Karte importieren")
        Hauptmenü.MainMenü.KarteLaden.Filter = "AW DS " + Sprachconverter.Translate("Karte") + "|*.aws"
        If Hauptmenü.MainMenü.KarteLaden.ShowDialog() = Windows.Forms.DialogResult.OK Then
            If Hauptmenü.MainMenü.KarteLaden.CheckFileExists Then
                'Jetzt Laden wir die Karte im Editor
                Dim Name As String = Hauptmenü.MainMenü.KarteLaden.FileName
                ObjektKarteneditormenü.ImportAWSMap(Name)
                GenerateUnitIDs()
                Objektverwalter.ÜbergängeAktualiesieren()
                Objektverwalter.Zentrieren()
            End If
            Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    Public Shared Sub KarteausBildLadenEditor()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.BildkarteLaden.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"
        Hauptmenü.MainMenü.KarteLaden.Title = Sprachconverter.Translate("Karte importieren")
        If Hauptmenü.MainMenü.BildkarteLaden.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Objektverwalter.Spielfeld = KarteAusBildLaden(Hauptmenü.MainMenü.BildkarteLaden.FileName)
            Objektverwalter.Zentrieren()
            Objektverwalter.ÜbergängeAktualiesieren()
            Dim M As ObjektKarteneditormenü = Objektverwalter.Menü
            M.Karteneditor.SpielerauswahlcheckKlick()
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()

    End Sub
    Public Shared Sub KarteExportieren()
        ObjektMaus.Visible = False
        Cursor.Show()
        Hauptmenü.MainMenü.SpeichenUnter.InitialDirectory = My.Settings.Resourcenpfad + "Karten\"
        Hauptmenü.MainMenü.SpeichenUnter.Title = Sprachconverter.Translate("Karte Exportieren")
        Hauptmenü.MainMenü.SpeichenUnter.Filter = "Commander Wars " + Sprachconverter.Translate("Karte") + "|*.txt"
        If Not Objektverwalter.Spielfeld.Kartenname = "" Then
            Hauptmenü.MainMenü.SpeichenUnter.FileName = Objektverwalter.Spielfeld.Kartenname
        End If
        If Hauptmenü.MainMenü.SpeichenUnter.ShowDialog() = Windows.Forms.DialogResult.OK Then
            Dim Name As String = Hauptmenü.MainMenü.SpeichenUnter.FileName
            If Name.IndexOf(".") < 0 Then
                Name += ".txt"
            End If
            SaveAsTxt(Name, Objektverwalter.Spielfeld)
        End If
        ObjektMaus.Visible = True
        Cursor.Hide()
    End Sub
    ''' <summary>
    ''' Spielfeld wird gespeichert
    ''' </summary>
    ''' <param name="Name">Nur Dateiname, ohne Endung oder Überordner</param>
    ''' <param name="Endung">Karte: ".map" | Speicherstände: ".sav"</param>
    ''' <remarks></remarks>
    Public Shared Sub Speichern(ByVal Name As String, Optional ByVal Endung As String = ".map", Optional ByVal Spielfeld As ObjektSpielfeld = Nothing, Optional ByVal KompletterPfad As Boolean = False)
        If Spielfeld Is Nothing Then
            Spielfeld = Objektverwalter.Spielfeld
        End If
        Dim Pfad As String = Name
        If Name.EndsWith(".map") Or Name.EndsWith(".sav") Or Name.EndsWith(".txt") Then
            Name = Name.Remove(Name.Length - 4)
        End If
        If Name.Contains("\") Then
            Name = Name.Remove(0, Name.LastIndexOf("\") + 1)
        End If
        If Endung = ".map" Then
            Spielfeld.Kartenname = Name
        End If
        If KompletterPfad = False Then
            Pfad = My.Settings.Resourcenpfad + "Karten"
            Pfad = IO.Path.Combine(Pfad, Name + Endung)
        End If

        If Pfad.ToLower.EndsWith(".sav") Then Pfad = Pfad.Replace("\Karten\", "\Spielstände\")

        If AufzeichnungAktiv Then
            AufzeichnungSichern(Pfad.Replace("\Spielstände\", "\Record\active\").Replace(".sav", ".rpl"))
            Spielfeld.MapPosition = Pfad.Replace("\Spielstände\", "\Record\active\").Replace(".sav", ".rpl")
        End If
        'Bei Spielständen sollte die Landschaften fest gemacht werden. Klasse Deutsch Was?
        If Endung = ".sav" Then
            For I = 0 To 1
                For X = 0 To Spielfeld.Breite - 1
                    For Y = 0 To Spielfeld.Höhe - 1
                        Spielfeld.Landschaften(X, Y, I).BildIDFest = True
                    Next
                Next
            Next
        End If
        Using Stream As New IO.FileStream(Pfad, IO.FileMode.Create, IO.FileAccess.Write)
            Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            Konverter.Serialize(Stream, Spielfeld)
        End Using

        If Endung = ".sav" Then
            My.Settings.LetztesSpiel = Pfad
            My.Settings.Save()
        End If
    End Sub
    ''' <summary>
    ''' Lädt ein Spielfeld und übergibt es an den Objektverwalter
    ''' Note: Wenn diese Karte geladen wird um sie weiter zu spielen muss:   Objektverwalter.Spielfeld.SpielWiederaufnehmen() aufegerufen werden.
    ''' </summary>
    ''' <param name="Name"></param>
    ''' <param name="GesamterName"></param>
    ''' <param name="Endung"></param>
    ''' <remarks></remarks>
    ''' 
    Public Shared Sub Laden(ByVal Name As String, ByVal GesamterName As Boolean, Optional ByVal Endung As String = ".map", Optional ByVal TexturenLaden As Boolean = True, Optional ByVal UpdateframeStarten As Boolean = True)
        Pause = True
        Dim neuesSpielfeld As ObjektSpielfeld
        Dim Pfad As String = Name
        If Name(1) <> ":" Then
            Pfad = My.Settings.Resourcenpfad + "Spielstände\"
        Else
            Pfad = ""
        End If
        If Not ((Name.EndsWith(".map")) Or (Name.EndsWith(".sav"))) Then
            If My.Computer.FileSystem.FileExists(Pfad + Name + Endung) Then
                Pfad += Name + Endung
            Else
                Pfad += Name.Trim + Endung
            End If
        Else
            Pfad += Name
        End If
        If GesamterName Then

            Dim S() As String = Name.Split(".")
            Endung = "." + S(S.Length - 1)
        End If

        Dim BilderNeuLaden As Boolean = False
        If My.Computer.FileSystem.FileExists(Pfad) Then
            Using Stream As New IO.FileStream(Pfad, IO.FileMode.Open, IO.FileAccess.Read)
                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                neuesSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
            End Using
            Dim CFarbe As Color = Nothing
            For I = 0 To neuesSpielfeld.Spieler.Length - 1
                If neuesSpielfeld.Spieler(I).Farbe = CFarbe Then
                    If I = 0 Then
                        neuesSpielfeld.Spieler(I).Farbe = Hauptmenü.SpielerNeutral
                    Else
                        neuesSpielfeld.Spieler(I).Farbe = GetFarbtabelle(I - 1)
                    End If
                End If
            Next
            'Damit der Ladebildschirm richtig funktioniert
            If Endung.ToLower = ".sav" Then
                If neuesSpielfeld.GetCommanderWarsModus <> My.Settings.CommanderWarsGameMoodus Then
                    'Wir müssen erst mal die Grafiken richtig laden.
                    Dim AlterModus = My.Settings.CommanderWarsGameMoodus
                    My.Settings.CommanderWarsGameMoodus = neuesSpielfeld.GetCommanderWarsModus
                    Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
                    BilderNeuLaden = True
                End If
                ObjektLadebildschirm.SetBrechreibung(neuesSpielfeld.Beschreibung)
            Else
                neuesSpielfeld.MapPosition = Pfad
            End If


            'Eigene Verweise werden generiert
            Objektverwalter.MarkierteFelder.Clear()
            ReDim neuesSpielfeld.Animationen(-1)

            If Objektverwalter.Spielfeld Is Nothing Or BilderNeuLaden Then
                'Wir müssen alle Texturen laden.

                For I = 0 To neuesSpielfeld.Spieler.Length - 1
                    If TexturenLaden = True Then
                        neuesSpielfeld.Spieler(I).Spieler = I
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                End If
                            Next
                        End If
                    Else
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                End If
                            Next
                        End If
                    End If
                Next
            Else
                'Texturen laden
                For I = 0 To neuesSpielfeld.Spieler.Length - 1
                    If TexturenLaden = True Then
                        neuesSpielfeld.Spieler(I).Spieler = I
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                End If
                            Next
                        End If
                    Else
                        If IsNothing(neuesSpielfeld.Spieler(I).KOS) = False Then
                            For I2 = 0 To neuesSpielfeld.Spieler(I).KOS.Length - 1
                                If IsNothing(neuesSpielfeld.Spieler(I).KOS(I2)) = False Then
                                    neuesSpielfeld.Spieler(I).KOS(I2) = ObjektLadeklasse.NewKO(neuesSpielfeld.Spieler(I).KOS(I2).KOID, I, neuesSpielfeld.Spieler(I).KOS(I2).Gabeleiste, neuesSpielfeld.Spieler(I).KOS(I2).Gabemodus, neuesSpielfeld.Spieler(I).KOS(I2).Sternkosten)
                                End If
                            Next
                        End If
                    End If
                Next
            End If
            'Das neueSpielfeld wird übergeben
            Objektverwalter.Spielfeld = neuesSpielfeld

            'Editor erstellen
            If Not Formmodus = Formmodi.Editor And Grafikengine.Grafikkarte IsNot Nothing Then
                Objektverwalter.Spielfeld.InfoAnzeige = New ObjektInfoAnzeige()
            End If
            'KO Anzeige erstellen
            If IsNothing(Objektverwalter.Spielfeld.AktuellerSpieler) = False Then
                Objektverwalter.Spielfeld.KOAnzeigen = New ObjektKOAnzeigen()
                Objektverwalter.Spielfeld.KOAnzeigen.KOAnzeigeerstellen()
            End If
            'Landschaften und Einheiten erstellen
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    For I = 0 To Objektverwalter.Spielfeld.Landschaften.GetLength(2) - 1
                        Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                        Dim L As ObjektLandschaft = Objektverwalter.Spielfeld.Landschaften(X, Y, I)
                        Objektverwalter.Spielfeld.Landschaften(X, Y, I) = New ObjektLandschaft(Objektverwalter.Spielfeld.Landschaften(X, Y, I).LandschaftsID, X, Y, Objektverwalter.Spielfeld, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude)
                        Objektverwalter.Spielfeld.Landschaften(X, Y, I).RestoreLandschaft(L)

                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude) = False Then
                            If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.GetRealGebäudeID = "VERWEIS" Then
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude = ObjektLadeklasse.NewGebäude(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.GebäudeID, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.KP, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung, X, Y, Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Feuerbereit)
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.KP = G.KP
                                Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.SetFeuerbereit(G.Feuerbereit)
                                If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.getFonds = True Then
                                    Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler).Geldgebäude += 1
                                End If
                            End If
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Angriff = ObjektGebäude.Angriffe.Sendeturm Then
                                Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler).Sendetürme += 1
                            End If
                        End If
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                            Dim Ladungen(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung.Length - 1) As ObjektEinheit
                            For I3 = 0 To Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung.Length - 1
                                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung(I3)
                                If Not E Is Nothing Then
                                    Ladungen(I3) = ObjektLadeklasse.NewEinheit(E.EinheitenID, E.Leben, E.Treibstoff, E.Munition, E.Spieler, E.Besetzen, X, Y, E.GetTarnung, E.HatsichBewegt)
                                End If
                            Next
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I) = ObjektLadeklasse.NewEinheit(Objektverwalter.Spielfeld.Einheiten(X, Y, I).EinheitenID, Objektverwalter.Spielfeld.Einheiten(X, Y, I).Leben, Objektverwalter.Spielfeld.Einheiten(X, Y, I).Treibstoff, Objektverwalter.Spielfeld.Einheiten(X, Y, I).Munition, Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler, Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen, X, Y, Objektverwalter.Spielfeld.Einheiten(X, Y, I).GetTarnung, Objektverwalter.Spielfeld.Einheiten(X, Y, I).HatsichBewegt)
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).Ladung = Ladungen
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).RestoreUnit(Einheit)
                        End If
                    Next
                Next
            Next
            If Objektverwalter.Spielfeld.Landschaften.GetLength(2) = 1 Then
                'Jetzt generieren wir noch die Luftschlacht
                Objektverwalter.Spielfeld = Objektverwalter.GenerateZufallskarteLuftschlacht(Objektverwalter.Spielfeld)
                'so jetzt überschreiben wir noch die Karte damit sie aktualisiert ist.

                ' Speichern(Pfad, ".map") '--> Muss mit Eagle abgestimmt werden.=)
            End If

            'Noch Scriptsachen machen.
            'ObjektScript.Reset() 'Grundsätzlich gibt es kein Script.
            'If Endung = ".sav" Then
            '    'Hmm. Einen Spielstand laden...
            '    '...heißt ein Spiel fortsetzen. Das heißt, das Script wurde noch nicht geladen!
            '    ObjektScript.Reset() 'Hier kann resetet werden, da die Scripts bisher nur bei Spielständen nicht Resetet wurden.
            '    'Bei Spielständen wurde ja auch im Gegensatz zu .map noch keine Scripts geladen.
            '    If Not IsNothing(Objektverwalter.Spielfeld.Scripte) Then
            '        For Each Script In Objektverwalter.Spielfeld.Scripte
            '            ObjektScript.addScript(Script)
            '        Next
            '    End If
            'End If
            If Objektverwalter.Spielfeld.Scripts Is Nothing Then ReDim Objektverwalter.Spielfeld.Scripts(-1)
            ObjektScript.Scripts = Objektverwalter.Spielfeld.Scripts
            Objektverwalter.Spielfeld.Sichterstellen()
            If Objektverwalter.Spielfeld.Regeln.BauBlockade Then
                Objektverwalter.Spielfeld.AktuellerSpieler.SpielerBaublockade = Objektverwalter.Spielfeld.AktuellerSpieler.KOS(0).GetBaublockade(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
            End If

            Objektverwalter.Zentrieren()
            Objektverwalter.ÜbergängeAktualiesieren()
        End If

        If UpdateframeStarten Then
            Hauptmenü.MainMenü.UpdateStart.Start()
        End If

    End Sub
    Public Shared Function KarteDefaultLaden(ByVal Karte As String) As ObjektSpielfeld
        Dim K As ObjektSpielfeld
        Using Stream As New IO.FileStream(Karte, IO.FileMode.Open, IO.FileAccess.Read)
            Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            K = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
        End Using
        Dim CFarbe As Color = Nothing
        For I = 0 To K.Spieler.Length - 1
            If K.Spieler(I).Farbe = CFarbe Then
                If I = 0 Then
                    K.Spieler(I).Farbe = Hauptmenü.SpielerNeutral
                Else
                    K.Spieler(I).Farbe = GetFarbtabelle(I - 1)
                End If
            End If
        Next
        Return K
    End Function
    ''' <summary>
    ''' Lädt eine Karte aus einem Bild, wobei Gebäude und Einheiten nicht erkannt werden können
    ''' </summary>
    ''' <param name="KompletterDateipfad"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function KarteAusBildLaden(ByVal KompletterDateipfad As String) As ObjektSpielfeld
        If Not Objektverwalter.Spielfeld Is Nothing Then
            'Wir holen uns erst einmal das Bild
            Dim Bild As Bitmap = Image.FromFile(KompletterDateipfad)
            Dim Spielfeld As ObjektSpielfeld = New ObjektSpielfeld(Bild.Width / 4, Bild.Height / 4, Objektverwalter.Spielfeld.Spieler, Objektverwalter.Spielfeld.Regeln)
            Spielfeld.Kartenname = KompletterDateipfad.Split("\")(KompletterDateipfad.Split("\").Length - 1).Split(".")(0)
            'Wir gehen das gesamte Spielfeld durch
            Dim B() As Bitmap = {}
            Dim Beschreibung() As String = {}
            For Each Datei In My.Computer.FileSystem.GetFiles(My.Settings.Resourcenpfad + "Minimap\")
                If Datei.Split(".")(1) = "bmp" Then
                    Dim S() As String = Datei.Split("\")
                    Dim File As String = S(S.Length - 1)
                    File = File.Split(".")(0)
                    File = File.Split("+")(0)
                    For I = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                        If File.ToUpper = Objektverwalter.LandschaftenBilder(I).ID Then
                            Array.Resize(B, B.Length + 1)
                            Array.Resize(Beschreibung, Beschreibung.Length + 1)
                            B(B.Length - 1) = Image.FromFile(Datei)
                            Beschreibung(Beschreibung.Length - 1) = File.ToUpper
                            Exit For
                        End If
                    Next
                End If
            Next
            For X = 0 To Spielfeld.Breite - 1
                For Y = 0 To Spielfeld.Höhe - 1
                    'Wir gehen solange durch bis wir die richtige Landschaftgefunden haben.
                    Dim Gefunden As Boolean = False
                    Dim I As Integer = 0
                    Do
                        For X2 = 0 To 3
                            For Y2 = 0 To 3
                                'Wir überprüfen die Farbgleichheit
                                Dim C1 As Color = B(I).GetPixel(X2, Y2)
                                Dim C2 As Color = Bild.GetPixel(X * 4 + X2, Y * 4 + Y2)
                                If C1.A + 10 > C2.A And C1.A - 10 < C2.A And C1.R + 10 > C2.R And C1.R - 10 < C2.R And C1.G + 10 > C2.G And C1.G - 10 < C2.G And C1.B + 10 > C2.B And C1.B - 10 < C2.B Then
                                    'Die Farben passen ungefähr.
                                Else
                                    I += 1
                                    GoTo Weiter
                                End If
                            Next
                        Next
                        Gefunden = True
                        Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht) = New ObjektLandschaft(Beschreibung(I), X, Y, Spielfeld)
Weiter:
                        If I >= B.Length Then
                            'Doof das ist ein Gebäude, damit können wir leider nichts Anfangen, deshalb machen wir dort eine Stadt hin.
                            Gefunden = True
                            Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude = New GebäudeStadt(0, X, Y, Spielfeld)
                        End If
                    Loop While Gefunden = False
                Next
            Next
            Return Spielfeld
        Else
            Return Nothing
        End If
    End Function
    Public Shared Function SelbeFarbtabelle(ByVal Tabelle1 As Bitmap, ByVal Tabelle2 As Bitmap) As Boolean
        For I = 0 To Tabelle1.Width - 1
            If Tabelle1.GetPixel(I, 0).ToArgb <> Tabelle2.GetPixel(I, 0).ToArgb Then
                Return False
            End If
        Next
        Return True
    End Function
#Region "Speichern und Laden in Textdateien"
    Public Shared Sub SaveAsTxt(ByVal Datei As String, ByVal Spielfeld As ObjektSpielfeld)
        If Not Spielfeld Is Nothing Then
            Using Writer As New IO.StreamWriter(Datei, False)
                Writer.WriteLine("Kartenname=" + Spielfeld.Kartenname)
                For I = 1 To Spielfeld.Spieler.Length - 1
                    Writer.WriteLine("Spieler|" + Spielfeld.Spieler(I).FondsproStadt.ToString + "|" + Spielfeld.Spieler(I).Fonds.ToString + "|" + CInt(Spielfeld.Spieler(I).KIStufe).ToString + "|" + Spielfeld.Spieler(I).Fabrikfonds.ToString)
                Next
                Writer.WriteLine("Größe|" + Spielfeld.Breite.ToString + "|" + Spielfeld.Höhe.ToString)
                'Wir exportieren nur die Bodenschlacht
                Dim Schlacht As Integer = 0
                For I = 0 To Schlacht
                    For Y = 0 To Spielfeld.Höhe - 1
                        For X = 0 To Spielfeld.Breite - 1
                            Dim G As ObjektGebäude = Spielfeld.Landschaften(X, Y, I).Gebäude
                            Dim T As String = ""
                            If Not G Is Nothing Then
                                If Not G.GetRealGebäudeID = "VERWEIS" Then
                                    T = ("Gebäude|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + G.GebäudeID + "|" + G.Spieler.ToString + "|" + G.Besetzung.ToString + "|" + G.Feuerladung.ToString + "|" + G.KP.ToString)
                                End If
                            Else
                                T = ("Landschaft|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + Spielfeld.Landschaften(X, Y, I).LandschaftsID + "|" + Spielfeld.Landschaften(X, Y, I).Leben.ToString)
                            End If
                            If Not T = "" Then
                                Writer.WriteLine(T)
                            End If
                            T = ""
                            Dim E As ObjektEinheit = Spielfeld.Einheiten(X, Y, I)
                            If Not E Is Nothing Then
                                Writer.WriteLine("Einheit|" + X.ToString + "|" + Y.ToString + "|" + I.ToString + "|" + E.EinheitenID + "|" + E.Munition.ToString + "|" + E.Treibstoff.ToString + "|" + E.getKP.ToString + "|" + E.Spieler.ToString)
                            End If
                            If Not T = "" Then
                                Writer.WriteLine(T)
                            End If
                        Next
                    Next
                Next
            End Using
        End If
    End Sub
    Public Shared Function LoadMapOutOfTxt(ByVal Datei As String, ByVal KampfanimationenLaden As Boolean, ByVal EineitenTexturenLaden As Boolean, ByVal GebäudeTexturenLaden As Boolean) As ObjektSpielfeld
        Using Reader As New IO.StreamReader(Datei, System.Text.Encoding.Default)
            Dim Kartenname As String = ""

            Dim Z As String = Reader.ReadLine
            Kartenname = Z.Split("=")(1)
            Dim Spieler As ObjektSpieler() = {New ObjektSpieler(0, Hauptmenü.SpielerNeutral, 1000, New ObjektKO() {ObjektLadeklasse.NewKO("OFFIZIEROS", 0), Nothing}, 0, Armeen.OS.ToString, "q", Nothing, ObjektSpieler.KIStufen.Einfach, 30000)}
            Dim Breite As Integer
            Dim Höhe As Integer
            While Reader.EndOfStream = False
                Z = Reader.ReadLine
                If Z.StartsWith("Spieler|") Then
                    Dim Z2 As String() = Z.Split("|")
                    Array.Resize(Spieler, Spieler.Length + 1)
                    Spieler(Spieler.Length - 1) = New ObjektSpieler(Spieler.Length, GetFarbtabelle(Spieler.Length - 2), Z2(1), New ObjektKO() {ObjektLadeklasse.NewKO("OFFIZIEROS", 0), Nothing}, Z2(2), GetArmy(Spieler.Length - 2), GetTeam(Spieler.Length - 2), Nothing, Z2(3), Z2(4))
                    Continue While
                End If
                If Z.StartsWith("Größe|") Then
                    Dim Z2 As String() = Z.Split("|")
                    Breite = Z2(1)
                    Höhe = Z2(2)
                    Exit While
                End If
            End While
            Dim S As ObjektSpielfeld = New ObjektSpielfeld(Breite, Höhe, Spieler, New ObjektRegeln(Spieler.Length - 1, False))
            S.Kartenname = Kartenname
            S.Autor = "Robosturm & Eagle"
            While Reader.EndOfStream = False
                Z = Reader.ReadLine
                If Z.StartsWith("Gebäude") Then
                    Dim Z2() As String = Z.Split("|")
                    If Not Z2(4) = "VERWEIS" Then
                        S.Landschaften(Z2(1), Z2(2), Z2(3)).Gebäude = ObjektLadeklasse.NewGebäude(Z2(4), Z2(5), Z2(8), Z2(6), Z2(1), Z2(2), Z2(7), Z2(3), S)
                    End If
                    Continue While
                End If
                'es ist ein Gebäude
                If Z.StartsWith("Landschaft") Then
                    Dim Z2() As String = Z.Split("|")
                    S.Landschaften(Z2(1), Z2(2), Z2(3)) = New ObjektLandschaft(Z2(4), Z2(1), Z2(2), S)
                    Continue While
                End If
                'Es ist eine Einheit 
                If Z.StartsWith("Einheit") Then
                    Dim Z2() As String = Z.Split("|")
                    S.Einheiten(Z2(1), Z2(2), Z2(3)) = ObjektLadeklasse.NewEinheit(Z2(4), Z2(7) * 10, Z2(6), Z2(5), Z2(8), False, Z2(1), Z2(2), False, False)
                    Continue While
                End If
            End While
            Return S
        End Using
    End Function
    Public Shared Function GetFarbtabelle(ByVal Spieler As Integer) As Color
        While Spieler > AlleFarbtabellen.Length
            Spieler -= AlleFarbtabellen.Length
        End While
        Return AlleFarbtabellen(Spieler)
    End Function
    Public Shared Function GetTeam(ByVal Spieler As Integer) As Objektverwalter.ABC
        Dim Teams As Integer = [Enum].GetNames(Objektverwalter.ABC.A.GetType).Length
        While Spieler > Teams
            Spieler -= Teams
        End While
        Return Spieler
    End Function
    Public Shared Function GetArmy(ByVal Spieler As Integer) As String
        Dim Teams As Integer = [Enum].GetNames(Armeen.AC.GetType).Length
        While Spieler > Teams
            Spieler -= Teams
        End While
        Dim A As Armeen = Spieler
        Return A.ToString
    End Function
    ''' <summary>
    ''' Generiert die Bild IDs der Einheiten
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub GenerateUnitIDs()
        If Not Objektverwalter.Spielfeld Is Nothing Then
            Dim Schlacht As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlacht = 1
            For I = 0 To Schlacht
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                        If Not Objektverwalter.Spielfeld.Einheiten(X, Y, I) Is Nothing Then
                            Objektverwalter.Spielfeld.Einheiten(X, Y, I).BildIDbestimmen()
                        End If
                    Next
                Next
            Next
        End If
    End Sub
    Public Shared Sub ImportAll(ByVal ReadPfad As String, ByVal CopyPfad As String, ByVal Suche As Microsoft.VisualBasic.FileIO.SearchOption)
        For Each File In My.Computer.FileSystem.GetFiles(ReadPfad, Suche, "*.txt")
            Dim D As String = File.Replace(ReadPfad, CopyPfad)
            Speichern(D.Replace(".txt", ".map"), , LoadMapOutOfTxt(File, False, False, False), True)
        Next
    End Sub
    Public Shared Sub ExportAll(ByVal CopyPfad As String, ByVal ReadPfad As String, ByVal Suche As Microsoft.VisualBasic.FileIO.SearchOption)
        If Not CopyPfad.EndsWith("\") Then CopyPfad += "\"
        For Each File In My.Computer.FileSystem.GetFiles(ReadPfad, Suche, "*.map")
            Using Stream As New IO.FileStream(File, IO.FileMode.Open, IO.FileAccess.Read)
                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
                Dim S As ObjektSpielfeld = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                Dim Name As String = S.Kartenname
                If Name.EndsWith(".map") Or Name.EndsWith(".sav") Or Name.EndsWith(".txt") Then
                    Name = Name.Remove(Name.Length - 4)
                End If
                If Name.Contains("\") Then
                    Name = Name.Remove(0, Name.LastIndexOf("\") + 1)
                End If
                File = File.Replace(ReadPfad, CopyPfad)
                SaveAsTxt(File.Replace(".map", ".txt"), S)
            End Using
        Next
    End Sub
#End Region
#End Region
#Region "Spracherkennung"
    'Shared EngineSprach As SpeechRecognitionEngine
    ''' <summary>
    ''' Wenn False, dann werden erkannte Wörter nicht mehr berücksichtigt
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared SprachLauschen As Boolean = False

    ''' <summary>
    ''' Initialisiert die Engine für die Spracherkennung. Sollte einmal am Anfang des Spieles aufgerufen werden.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub SprachIni()
        'EngineSprach = New SpeechRecognitionEngine
        'EngineSprach.SetInputToDefaultAudioDevice()

        'Try
        '    EngineSprach.UnloadAllGrammars() 'Erstmal alles wegmachen, bevor wir was neues Laden

        '    Dim Gramm As New Grammar(My.Settings.Resourcenpfad + "Grammatik\Hauptmenü.gramm", "Thema")
        '    EngineSprach.LoadGrammar(Gramm)
        '    'For Each Dat In My.Computer.FileSystem.GetFiles(My.Settings.Resourcenpfad + "Grammatik\")
        '    '    If Dat.EndsWith(".gramm") Then 'Nur zur sicherheit, aber eigentlich sollten hier nur Grammatiken sein.
        '    '        Dim Gramm As New Grammar(Dat, "Thema")
        '    '        EngineSprach.LoadGrammar(Gramm)
        '    '    End If
        '    'Next

        '    AddHandler EngineSprach.SpeechRecognized, AddressOf Spracherkenntnis 'Damit das Event an der richtigen Stelle landet.

        '    EngineSprach.RecognizeAsync(System.Speech.Recognition.RecognizeMode.Multiple) 'Anfangen zu lauschen :)
        'Catch
        '    '  Console.WriteLine("Spracherkennung: Ein Fehler ist beim Laden der Grammatik aufgetreten!")
        '    MsgBox("Ein Fehler ist beim Laden der Grammatik aufgetreten!")
        'End Try
    End Sub
    Public Shared Sub SprachReload(ByVal menü As Formmodi)
        'EngineSprach.UnloadAllGrammars()
        'Dim Gramm As New Grammar(My.Settings.Resourcenpfad + "Grammatik\" + menü.ToString + ".gramm", "Thema")
        'EngineSprach.LoadGrammar(Gramm)
    End Sub
    '''' <summary>
    '''' Diese Routine wird eigentlich nur von dem Event der Spracherkennung aufgerufen. Nicht zum aufrufen gedacht.
    '''' </summary>
    '''' <param name="sender"></param>
    '''' <param name="e"></param>
    '''' <remarks></remarks>
    'Private Shared Sub Spracherkenntnis(ByVal sender As Object, ByVal e As System.Speech.Recognition.SpeechRecognizedEventArgs)
    '    If SprachLauschen And My.Settings.SprachZuhören Then 'Nur wenn wir grad zuhören sollen
    '        If e.Result.Confidence >= My.Settings.SprachSensitivität Then
    '            Objektverwalter.Menü.SprachEingabe(e.Result.Text)
    '        End If
    '    End If
    'End Sub
#End Region
#Region "Netzwerk"
    Structure NetzwerkTeilnehmer
        Public ID As Integer
        Public Name As String
        Public Bereit As Boolean

        Sub New(ByVal ID As Integer)
            Me.ID = ID
            Bereit = False
        End Sub
        Sub New(ByVal ID As Integer, ByVal Bereit As Boolean)
            Me.ID = ID
            Me.Bereit = Bereit
        End Sub
        Sub New(ByVal ID As Integer, ByVal Name As String)
            Me.ID = ID
            Me.Name = Name
            Bereit = False
        End Sub
        Sub New(ByVal ID As Integer, ByVal Name As String, ByVal Bereit As Boolean)
            Me.ID = ID
            Me.Name = Name
            Me.Bereit = Bereit
        End Sub
    End Structure
    Enum NetzVorbereitungen
        Bereit
        NichtBereit

    End Enum
    Public Shared NetzTeilnehmer() As NetzwerkTeilnehmer = {}
    'Variablen:
    Public Shared NetzConnection As Peer
    Public Shared NetzDeviceAddress As Address
    Public Shared NetzConnected As Boolean = False
    Public Shared NetzVorratsBefehle As New List(Of KIPassivNetzwerk.Befehl)
    Public Shared NetzHosten As Boolean

    'Initialisierung:
    Public Shared Sub NetzIni(ByVal Host As Boolean, Optional ByVal Password As String = "")
        NetzHosten = Host
        NetzConnection = New Peer
        AddHandler NetzConnection.FindHostResponse, AddressOf OnFindHost
        AddHandler NetzConnection.ConnectComplete, AddressOf OnConnectComplete
        AddHandler NetzConnection.Receive, AddressOf NetzBefehlRecieved
        AddHandler NetzConnection.SessionTerminated, AddressOf OnSessionTerminated
        'AddHandler NetzConnection.HostMigrated, AddressOf OnHostMigrated
        AddHandler NetzConnection.PlayerCreated, AddressOf OnPlayerCreated
        AddHandler NetzConnection.PlayerDestroyed, AddressOf OnPlayerDestroyed

        ' Check to see if we can create a TCP/IP connection
        If Not IsServiceProviderValid(Address.ServiceProviderTcpIp) Then

            ' Nope, can't, quit this application
            MessageBox.Show("Could not create a TCP/IP service provider.", "Exiting", MessageBoxButtons.OK, MessageBoxIcon.Information)
            'Me.Close()
            'Mal schauen, was wir machen müssen wenn wir hier landen, vermutlich auch irgendwie Beenden. Allerdings weiß ich grad nicht genau, wann dieser Fall auftritt.
            Exit Sub
        End If

        ' Erstmal eine Adresse für unsern Computer machen
        NetzDeviceAddress = New Address()
        NetzDeviceAddress.ServiceProvider = Address.ServiceProviderTcpIp

        Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
        ' Dann brauchen wir noch eine Beschreibung für unser tolles Spiel
        Dim desc As ApplicationDescription = New ApplicationDescription()
        ' desc.Flags += SessionFlags.MigrateHost 'Noch eine Idee meinerseits, ich weiß aber nicht ob das mit den Flags so hinhaut. Auf jeden fall macht die Syntax-Prüfung keinen Error
        'Ist in Commander Wars aber wahrscheinlich auch nicht so wichtig. Da das Spiel vermutlich eh abgebrochen werden muss. Egal, ob Host oder Client das Spiel verlassen.
        'Generell könnte man damit erreichen, dass wenn der Host weg ist, ein Client zum neuen Host ernannt wird, ohne das die Verbindung unterbrochen werden muss.
        desc.SessionName = "Commander Wars - Netzwerkspiel"
        desc.GuidApplication = SpielGUID
        'Eigentlich wird ja automatisch eine GUID erstellt. (My Project -> Assemblyinformationen oder so ähnlich) Aber ich weiß leider nicht, wie wir darauf zugreifen können.

        If Host Then
            'So jetzt noch ein paar Sachen in die Desc reinschreiben
            'desc.CurrentPlayers = 1
            'desc.MaxPlayers = M.KIStufen.Length - 1
            desc.SessionName = M.SpielKarten(ObjektKartenauswahlMenü.AngezeigteKarten(ObjektKartenauswahlMenü.MomentaneKarte)).Kartenname

            'wir suchen uns eine neue GameID
            If BaseLobby.ServerConnected Then
                If BaseLobby.ServerHost Then
                    SyncLock BaseLobby.Games
                        BaseLobby.Games.Add(New GameInfo(BaseLobby.FindNewGameID, BaseLobby.ClientID, desc.MaxPlayers, desc.SessionName, My.Application.Info.Version, Password, BaseLobby.GetMyIP))
                    End SyncLock
                Else
                    'Wir haben ein Spiel erstellt, das senden wir an den Host der Lobby der es dann weiter zurück an uns verteilt
                    Dim G As New GameInfo(0, BaseLobby.ClientID, desc.MaxPlayers, desc.SessionName, My.Application.Info.Version, Password, BaseLobby.GetMyIP)
                    BaseLobby.NetzBefehlSenden("GameCreated:" + G.tostring)
                End If
            End If
            Try 'Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host Host
                NetzConnection.Host(desc, NetzDeviceAddress)
                ' Wenn es bis hier keinen Fehler gab, dann hosten wir ein neues Spiel. Glückwunsch :)
                NetzConnected = True 'Also wenn ICH die Session veranstalte, dann bin ich doch wohl verbunden, oder nicht?


            Catch
                ' Console.WriteLine("Netzwerk: Hosting this session has failed. :=(")
            End Try
        Else

            Try 'Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client 
                NetzConnection.FindHosts(desc, Nothing, NetzDeviceAddress, Nothing, 0, 0, 0, FindHostsFlags.OkToQueryForAddressing)

                ' Console.WriteLine("Netzwerk: Looking for sessions.")

            Catch
                '   Console.WriteLine("Netzwerk: Enumeration of sessions has failed.")
            End Try
        End If
    End Sub
    Public Shared Sub NetzIni(ByVal HostAdress As Address)
        NetzHosten = False
        NetzConnection = New Peer
        AddHandler NetzConnection.FindHostResponse, AddressOf OnFindHost
        AddHandler NetzConnection.ConnectComplete, AddressOf OnConnectComplete
        AddHandler NetzConnection.Receive, AddressOf NetzBefehlRecieved
        AddHandler NetzConnection.SessionTerminated, AddressOf OnSessionTerminated
        'AddHandler NetzConnection.HostMigrated, AddressOf OnHostMigrated
        AddHandler NetzConnection.PlayerCreated, AddressOf OnPlayerCreated
        AddHandler NetzConnection.PlayerDestroyed, AddressOf OnPlayerDestroyed

        ' Check to see if we can create a TCP/IP connection
        If Not IsServiceProviderValid(Address.ServiceProviderTcpIp) Then

            ' Nope, can't, quit this application
            MessageBox.Show("Could not create a TCP/IP service provider.", "Exiting", MessageBoxButtons.OK, MessageBoxIcon.Information)
            'Me.Close()
            'Mal schauen, was wir machen müssen wenn wir hier landen, vermutlich auch irgendwie Beenden. Allerdings weiß ich grad nicht genau, wann dieser Fall auftritt.
            Exit Sub
        End If

        ' Erstmal eine Adresse für unsern Computer machen
        NetzDeviceAddress = New Address()
        NetzDeviceAddress.ServiceProvider = Address.ServiceProviderTcpIp

        Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
        ' Dann brauchen wir noch eine Beschreibung für unser tolles Spiel
        Dim desc As ApplicationDescription = New ApplicationDescription()
        ' desc.Flags += SessionFlags.MigrateHost 'Noch eine Idee meinerseits, ich weiß aber nicht ob das mit den Flags so hinhaut. Auf jeden fall macht die Syntax-Prüfung keinen Error
        'Ist in Commander Wars aber wahrscheinlich auch nicht so wichtig. Da das Spiel vermutlich eh abgebrochen werden muss. Egal, ob Host oder Client das Spiel verlassen.
        'Generell könnte man damit erreichen, dass wenn der Host weg ist, ein Client zum neuen Host ernannt wird, ohne das die Verbindung unterbrochen werden muss.
        desc.SessionName = "Commander Wars - Netzwerkspiel"
        desc.GuidApplication = SpielGUID
        'Eigentlich wird ja automatisch eine GUID erstellt. (My Project -> Assemblyinformationen oder so ähnlich) Aber ich weiß leider nicht, wie wir darauf zugreifen können.


       
        Try 'Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client Client 
            NetzConnection.FindHosts(desc, HostAdress, NetzDeviceAddress, Nothing, 0, 0, 0, FindHostsFlags.OkToQueryForAddressing)

            ' Console.WriteLine("Netzwerk: Looking for sessions.")

        Catch
            '   Console.WriteLine("Netzwerk: Enumeration of sessions has failed.")
        End Try
    End Sub
    Private Shared Function IsServiceProviderValid(ByVal provider As Guid) As Boolean

        ' Ask DirectPlay for the service provider list
        Dim providers() As ServiceProviderInformation = NetzConnection.GetServiceProviders(True)

        ' For each service provider in the returned list...
        For Each info In providers

            ' Compare the current provider against the passed provider
            If info.Guid = provider Then Return True

        Next

        ' Not found
        Return False
    End Function


    'Events:
    Private Shared Sub OnFindHost(ByVal sender As Object, ByVal e As Microsoft.DirectX.DirectPlay.FindHostResponseEventArgs)
        SyncLock NetzConnection 'Da wir ja nicht wollen, dass 2 Threads gleichzeitig zwei unterschiedliche Hosts finden und dann diese Routine zwei mal durchlaufen wird. Ich glaube du verstehst was ich meine und ja, die Wahrscheinlichkeit ist gar nicht mal so niedrig!
            'ein bischen abgewandelt. Ursprünglich:      SyncLock Me

            If NetzConnected Then Exit Sub 'Wenn wir schon verbunden sind, brauchen wir keine neue Verbindung mehr.

            NetzConnected = True 'Ab jetzt sind wir verbunden
            Dim foundSession As String = String.Format("Found session ({0}), trying to connect.", e.Message.ApplicationDescription.SessionName)



            'erstmal ein kleines Begrüßungsgeschenk machen :) (Dein Nickname)
            Dim Geschenk As New NetworkPacket
            Geschenk.Write(My.Settings.Autor) 'Allerdings weiß ich nicht wie man das "Geschenk" erhält :[
            'Mit dem erstbesten verbinden
            Dim pee As Peer = sender
            pee.Connect(e.Message.ApplicationDescription, e.Message.AddressSender, e.Message.AddressDevice, Geschenk, Microsoft.DirectX.DirectPlay.ConnectFlags.OkToQueryForAddressing)

        End SyncLock 'Ende SyncLock. Der Kritische Breich, in dem nur ein Thread gleichzeitig arbeiten kann ist vorbei. Puh!

        If TypeOf Objektverwalter.Menü Is ObjektNetzwerkMenü Then
            With Objektverwalter.Menü
                'Jetzt will ich die ja als anderer Thread verändern, deshalb vorsichtshalber hier Synclock und hoffen, dass nichts schlimmes passiert.
                '(Das Risiko muss jedes Spiel bloß einmal am Anfang eingegangen werden, ist also nicht so schlimm, sollte es verbuggt sein :))
                .LöschenButton("Beitreten")
                .LöschenButton("Erstellen")
                .NeuButton(Hauptmenü.MainMenü.MalPanel.Width - 138, Hauptmenü.MainMenü.MalPanel.Height - 30, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(1, 1))
            End With
        End If
        'Noch ne Anmerkung:
        'Was das "OkToQueryForAddressing" Flag betrifft. (Es geht natürlich auch ohne). Das heißt, das DirectPlay seine eigenen Fensterchen machen darf. Bei dem beitreten kommt ja nochmal ein Fensterchen, wo man den Hostnamen eingeben soll... Wenn man den Flag nicht setzt (In einem VollBild-Spiel wäre das ja doof) werden dann halt Exceptions geworfen. stell also sicher das Hostname, Port und so weiter angegeben ist!
    End Sub
    Private Shared Sub OnConnectComplete(ByVal sender As Object, ByVal e As Microsoft.DirectX.DirectPlay.ConnectCompleteEventArgs)
        ' Nachschauen, ob wir korrekt verbunden sind.
        If e.Message.ResultCode = DirectPlay.ResultCode.Success Then
            'Console.WriteLine("Netzwerk: Connect Success.")
            NetzConnected = True
        Else
            ' Console.WriteLine("Netzwerk: Connect Failure: " + e.Message.ResultCode.ToString)
            NetzConnected = False
        End If

        'SyncLock NetzTeilnehmer
        '    Array.Resize(NetzTeilnehmer, NetzConnection.Players.Count)
        '    For i = 0 To NetzTeilnehmer.Length - 1
        '        Dim s As String = NetzConnection.Players.Item(i).ToString
        '        Dim nT As New NetzwerkTeilnehmer(CInt(s))
        '        NetzTeilnehmer(i) = nT
        '    Next
        'End SyncLock
    End Sub
    Private Shared Sub OnSessionTerminated(ByVal sender As Object, ByVal e As Microsoft.DirectX.DirectPlay.SessionTerminatedEventArgs)
        NetzConnected = False
    End Sub
    Private Shared Sub OnPlayerCreated(ByVal sender As Object, ByVal e As Microsoft.DirectX.DirectPlay.PlayerCreatedEventArgs)
        Dim nT As New NetzwerkTeilnehmer(e.Message.PlayerID)
        SyncLock NetzTeilnehmer
            Array.Resize(NetzTeilnehmer, NetzTeilnehmer.Length + 1)
            NetzTeilnehmer(NetzTeilnehmer.Length - 1) = nT
        End SyncLock
        If NetzHosten Then
            Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
            Dim Datei As String = M.GetMomentaneKarte()
            Dim Hash As Integer = My.Computer.FileSystem.ReadAllText(Datei, System.Text.Encoding.UTF8).GetHashCode
            'Send new Map?
            NetzBefehlKartenauswahlSendenHash(Hash)
            'Send all Custom Units of us to the new player!
            Hauptmenü.NetzCustomDatentransfer()
        End If

        'Es gibt einen neuen Spieler. Dann teilen wir ihm am besten unseren Nickname mit, damit wir uns schön unterhalten können :)
        NetzBefehlSendenName(My.Settings.Autor)
    End Sub
    Private Shared Sub OnPlayerDestroyed(ByVal sender As Object, ByVal e As Microsoft.DirectX.DirectPlay.PlayerDestroyedEventArgs)
        If NetzTeilnehmer IsNot Nothing Then
            SyncLock NetzTeilnehmer
                If NetzConnection.Disposed Then Exit Sub 'Wir scheinen die Verbindung ordnungsgemäß beendet zu haben.

                Dim i As Integer = 0
                If NetzConnected Then
                    Do Until i > NetzConnection.Players.Count
                        If NetzTeilnehmer(i).ID = e.Message.PlayerID Then
                            NetzTeilnehmer(i) = NetzTeilnehmer(NetzTeilnehmer.Length - 1)
                            Array.Resize(NetzTeilnehmer, NetzTeilnehmer.Length - 1)
                            Exit Sub
                        End If
                    Loop
                End If
            End SyncLock
        End If
    End Sub

    Public Shared Sub NetzLeaveGame(ByVal Text As String)
        Dim Begründung As New NetworkPacket
        Begründung.Write(Text)
        Hauptmenü.NetzConnection.TerminateSession(Begründung)
        Hauptmenü.NetzConnection.Dispose()
    End Sub
    'Andere Routinen:
    Public Shared Sub NetzBefehlSenden(ByVal _Befehl As KIPassivNetzwerk.Befehl)
        Dim Paket As New NetworkPacket 'Ein schön handliches Paket zusammenstellen
        Dim s As String = "Befehl1|" + CInt(_Befehl.Befehl).ToString + "|"
        s += _Befehl.KooX.ToString + "|"
        s += _Befehl.KooY.ToString + "|"
        Dim WX As String = ""
        Dim WY As String = ""
        For I = 0 To _Befehl.WegX.Length - 1
            If I = _Befehl.WegX.Length - 1 Then
                WX += _Befehl.WegX(I).ToString + "|"
                WY += _Befehl.WegY(I).ToString + "|"
            Else
                WX += _Befehl.WegX(I).ToString + "$"
                WY += _Befehl.WegY(I).ToString + "$"
            End If
        Next
        s += WX
        s += WY
        s += _Befehl.OpferX.ToString + "|"
        s += _Befehl.OpferY.ToString + "|"
        s += _Befehl.AngreiferSchaden.ToString + "|"
        s += _Befehl.Verteidigerschaden.ToString + "|"
        s += _Befehl.Spieler.ToString
        If NetzConnected Then
            Paket.Write(s)
            'und verschicken.
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(s)
        End If
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal V As NetzVorbereitungen)
        If Not NetzConnected Then Exit Sub 'Das muss in keine Aufzeichnung rein :)
        Select Case V
            Case NetzVorbereitungen.Bereit
                Dim Paket As New NetworkPacket
                Paket.Write("Vorbereitung|Bereit")
                NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, SendFlags.Guaranteed)
            Case NetzVorbereitungen.NichtBereit
                Dim Paket As New NetworkPacket
                Paket.Write("Vorbereitung|NichtBereit")
                NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, SendFlags.Guaranteed)
        End Select
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal Wetteränderung As ObjektSpielfeld.Wetterarten)
        Dim i As Integer = Wetteränderung
        If NetzConnected Then
            If Objektverwalter.Spielfeld IsNot Nothing Then
                Dim Paket As New NetworkPacket
                Paket.Write("Befehl0|Wetter|" + i.ToString + "|" + Objektverwalter.Spielfeld.AktuellerSpieler.Spieler.ToString)
                If NetzConnected Then
                    NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
                End If
            End If
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|Wetter|" + i.ToString + "|" + Objektverwalter.Spielfeld.AktuellerSpieler.Spieler.ToString)
        End If
    End Sub
    Public Shared Sub NetzBefehlSenden(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal Treibstoff As Integer)
        Dim Paket As New NetworkPacket 'Ein schön handliches Paket zusammenstellen
        Dim s As String = "Befehl0|Treibstoff|" + X.ToString + "|" + Y.ToString + "|" + Schlacht.ToString + "|" + Treibstoff.ToString
        If NetzConnected Then
            Paket.Write(s)
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(s)
        End If
    End Sub
    Public Shared Sub NetzBefehlSendenName(ByVal Nickname As String)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("VorbereitungKarte|Nickname|" + Nickname)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, SendFlags.Guaranteed)
    End Sub
    Public Shared Sub NetzBefehlSendenEinheitVerbessern(ByVal X As Integer, ByVal Y As Integer, ByVal Schlacht As Integer, ByVal ATKBoost As Integer, ByVal BewBoost As Integer)
        If NetzConnected Then
            Dim Paket As New NetworkPacket
            Paket.Write("Befehl0|Verbessern|" + ATKBoost.ToString + "|" + BewBoost.ToString)
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|Verbessern|" + ATKBoost.ToString + "|" + BewBoost.ToString)
        End If
    End Sub
    Public Shared Sub NetzBefehlSendenSchlachtfeldWechsel(ByVal Spieler As Integer)
        If NetzConnected Then
            Dim Paket As New NetworkPacket
            Paket.Write("Befehl0|SchlachtWechsel|" + Spieler.ToString)
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|SchlachtWechsel|" + Spieler.ToString)
        End If
    End Sub
    ''' <summary>
    ''' Lässt alle Netzwerkteilnehmer den Gleichen KO für einen Spieler auswählen.
    ''' </summary>
    ''' <param name="Spieler">Der Spieler, dessen KO betroffen ist.</param>
    ''' <param name="KOID">Die ID des zu setzenden KOs</param>
    ''' <param name="Stelle">Ob an Erster oder Zweiter stelle das heißt[ 0 oder 1 ] !!!</param>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlKartenauswahlSendenKO(ByVal Spieler As Integer, ByVal KOID As String, ByVal Stelle As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|KO|" + Spieler.ToString + "|" + KOID + "|" + Stelle.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenHash(ByVal Hash As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("VorbereitungKarte|Hash|" + Hash.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenKarteAnfordern()
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("VorbereitungKarte|KarteAnfordern")
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenStartgeld(ByVal Spieler As Integer, ByVal Geld As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|Startgeld|" + Spieler.ToString + "|" + Geld.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenFondsProStadt(ByVal Spieler As Integer, ByVal Geld As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|GeldStadt|" + Spieler.ToString + "|" + Geld.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenFondsProFabrik(ByVal Spieler As Integer, ByVal Geld As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|GeldFabrik|" + Spieler.ToString + "|" + Geld.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenTeam(ByVal Spieler As Integer, ByVal Team As Char)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|Team|" + Spieler.ToString + "|" + Team)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenUpdateBeendet()
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|UpdateBeendet")
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenBauliste(ByVal Spieler As Integer, ByVal Bauliste As ObjektKartenauswahlMenü.KartenAuswahlBaulisten)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|BaulisteFest|" + Spieler.ToString + "|" + Bauliste.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenBauliste(ByVal Spieler As Integer, ByVal Baulisten As Bauliste)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|BaulisteOffen|" + Spieler.ToString + "|" + Baulisten.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlKartenauswahlSendenRegeln(ByVal Regeln As ObjektRegeln)
        Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|Regeln|" + CInt(Regeln.Nebel).ToString + "|" + (Regeln.Besiegt.Length - 1).ToString + "|" + Regeln.GetStandartSiegbedingungen + "|" + Regeln.Zufallswetter.ToString + "|" + Regeln.GetWetterwahrscheinlichkeiten + "|" + CInt(Regeln.Wetter).ToString + "|" + Regeln.MaxSpieldauer.ToString + "|" + Regeln.MaximaleanzahlderBesetzungen.ToString + "|" + _
        Regeln.Luftschlacht.ToString + "|" + M.StartSpieler.ToString + "|" + M.Regeln.LevelModus + "|" + CInt(My.Settings.CommanderWarsGameMoodus).ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzBefehlSendenWolkenBewegen(ByVal X As Integer, ByVal Y As Integer, ByVal neuX As Integer, ByVal neuY As Integer)
        'Dim Paket As New NetworkPacket()
        'Paket.Write("Befehl0|Wolkenbewegen|" + X.ToString + "|" + Y.ToString + "|" + neuX.ToString + "|" + neuY.ToString)
        If NetzConnected Then
            Dim Paket As New NetworkPacket
            Paket.Write("Befehl0|Wolkenbewegen|" + X.ToString + "|" + Y.ToString + "|" + neuX.ToString + "|" + neuY.ToString)
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile("Befehl0|Wolkenbewegen|" + X.ToString + "|" + Y.ToString + "|" + neuX.ToString + "|" + neuY.ToString)
        End If
    End Sub
    Public Shared Sub NetzBefehlVulkanFeuer(ByVal X As Integer, ByVal Y As Integer, ByVal GetroffeneZiele() As Point)
        Dim Daten As String = "Befehl0|Vulkan|" + X.ToString + "|" + Y.ToString + "|"
        For I = 0 To GetroffeneZiele.Length - 1
            If I = GetroffeneZiele.Length - 1 Then
                Daten += GetroffeneZiele(I).ToString
            Else
                Daten += GetroffeneZiele(I).ToString + "|"
            End If
        Next

        If NetzConnected Then
            Dim Paket As New NetworkPacket()
            Paket.Write(Daten)
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
        End If
        If My.Settings.Aufzeichnen And AufzeichnungAktiv Then
            AufzeichnenZeile(Daten)
        End If
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <param name="Farbe">Der Argb-Wert der individuellen Farbe.</param>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlKartenauswahlSendenFarbeInd(ByVal Spieler As Integer, ByVal Farbe As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|Farbe0|" + Spieler.ToString + "|" + Farbe.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <param name="Farbe">Der Name einer Vordefinierten Farbe.</param>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlKartenauswahlSendenFarbe(ByVal Spieler As Integer, ByVal Farbe As Integer)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|Farbe1|" + Spieler.ToString + "|" + Farbe.ToString)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <param name="KI">Die KI, also entweder Einfach und so, oder Passiv, wenn man Mensch ist. Es ist also das was an die anderen gesendet wird, und nicht was für diesen Computer zählt.</param>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlKartenauswahlSendenKI(ByVal Spieler As Integer, ByVal KI As String)
        If Not NetzConnected Then Exit Sub
        Dim Paket As New NetworkPacket
        Paket.Write("Vorbereitung|KI|" + Spieler.ToString + "|" + KI)
        NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, 40)
    End Sub
    Public Shared Sub NetzChatSenden(ByVal text As String)
        If NetzConnected Then 'Nur zur sicherheit, bevor irgendein Idiot auf die Idee kommt in einem nicht-Netzwerkspiel übers Netzwerk zu chatten
            Dim Paket As New NetworkPacket
            Dim Spieler As ObjektSpieler = Objektverwalter.Spielfeld.AktuellerSpieler 'Falls irgendetwas ganz gewaltig schief läuft, (naja eigentlich einfach nur: Es gibt keinen Menschlichen Spieler mehr), dann sagt lieber der Aktive Spieler was, als das das Spiel abstürzt ;)
            For Each Sp In Objektverwalter.Spielfeld.Spieler
                If Sp.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    If Sp.Spieler = 0 Then Continue For
                    'Jetzt haben wir zumindest einen Menschen gefunden. Gehen wir mal davon aus, dass er derjenige ist, welcher Chatten will :)
                    Spieler = Sp
                    Exit For
                End If
            Next

            Dim s As String = "Chat|" + Spieler.Spieler.ToString + "|" + Spieler.KOS(0).KOID + "|" + text
            Paket.Write(s)
            NetzConnection.SendTo(PlayerID.AllPlayers, Paket, 0, SendFlags.Guaranteed)
        End If
    End Sub
    Shared Codierung As System.Text.Encoding = System.Text.Encoding.Default
    Public Shared Sub NetzDatenKartentransfer()
        If NetzConnected Then 'Ansonsten ist das Kartensenden eh Sinnlos :)
            If TypeOf Objektverwalter.Menü Is ObjektKartenauswahlMenü Then
                Dim M As ObjektKartenauswahlMenü = Objektverwalter.Menü
                Dim PfadKomplett As String = M.Kartenname(ObjektKartenauswahlMenü.AngezeigteKarten(ObjektKartenauswahlMenü.MomentaneKarte))
                '    Console.WriteLine("Folgende Karte wird über das Netzwerk an alle Clienten gesendet: " + PfadKomplett.Remove(0, PfadKomplett.LastIndexOf("\") + 1).Replace(".map", ""))
                If My.Computer.FileSystem.FileExists(PfadKomplett) Then 'Ich vermute mal, dass das überflüssig ist, aber man weiß ja nie...
                    Dim Bytes As String = My.Computer.FileSystem.ReadAllText(PfadKomplett, Codierung)
                    Dim Paket As New NetworkPacket
                    Paket.Write("Karte:" + Bytes)
                    'SendFlags.Guaranteed SendFlags.NoLoopback SendFlags.Coalesce

                    NetzConnection.SendTo(0, Paket, 0, 40)
                End If

            End If
        End If
    End Sub
    ''' <summary>
    ''' This function sends all Custom files to the Players
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub NetzCustomDatentransfer()
        If NetzConnected Then 'Ansonsten ist das Kartensenden eh Sinnlos :)
            Dim Paket As New NetworkPacket
            Paket.Write("custom stuff:start")
            NetzConnection.SendTo(0, Paket, 0, 40)
            For Each Directory In My.Computer.FileSystem.GetDirectories("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\", FileIO.SearchOption.SearchAllSubDirectories)
                For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchTopLevelOnly)
                    Paket = New NetworkPacket
                    If Directory.EndsWith("Unit\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".ent", "")
                        Paket.Write("custom stuff unit:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung))
                    ElseIf Directory.EndsWith("Sprites\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".png", "")
                        Paket.Write("custom stuff unit image:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung))
                    ElseIf Directory.EndsWith("(Optional) Zoomed Out\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".png", "")
                        Paket.Write("custom stuff unit image zoomed:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung))
                    ElseIf Directory.EndsWith("co\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".cco", "")
                        Paket.Write("custom stuff co:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung))
                    ElseIf Directory.EndsWith("co desc\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".desc", "")
                        Paket.Write("custom stuff co desc:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung))
                    ElseIf Directory.EndsWith("co sprite\") Then
                        Dim F() As String = File.Split("\")
                        Dim FileID As String = F(F.Length - 1).Replace(".png", "")
                        Paket.Write("custom stuff co sprite:" + FileID + ":" + My.Computer.FileSystem.ReadAllText(File, Codierung))
                    End If
                    If Paket.Length > 0 Then
                        NetzConnection.SendTo(0, Paket, 0, 40)
                    End If
                Next
            Next
            Paket = New NetworkPacket
            Paket.Write("custom stuff:end")
            NetzConnection.SendTo(0, Paket, 0, 40)
        End If
    End Sub

    Private Shared Sub NetzBefehlRecieved(ByVal line As String, ByVal SenderID As Integer)
        If line.ToLower.StartsWith("custom stuff") Then
            NetzBefehlCustomStuffRecieved(line)
            Exit Sub
        End If
        Dim sInfo() As String = line.Split("|") 'auseinander nehmen und dann bearbeiten
        Select Case sInfo(0).ToLower
            Case "Befehl1".ToLower
                NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(CInt(sInfo(1)), CInt(sInfo(2)), CInt(sInfo(3)), ToIntArry(sInfo(4).Split("$")), ToIntArry(sInfo(5).Split("$")), CInt(sInfo(6)), CInt(sInfo(7)), CSng(sInfo(8)), CSng(sInfo(9)), CInt(sInfo(10))))
            Case "Befehl0".ToLower
                Select Case sInfo(1).ToLower
                    Case "Wetter".ToLower
                        'Eine Wetteränderung, wie interressant :)
                        If sInfo.Length > 3 Then
                            NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, CInt(sInfo(3))))
                        Else
                            NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler))
                        End If
                    Case "SchlachtWechsel".ToLower
                        NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.Schlachtwechseln, 0, 0, New Integer() {0}, New Integer() {0}, 0, 0, 0, 0, sInfo(2)))
                    Case "Wolkenbewegen".ToLower
                        NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.WolkeBewegen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                    Case "vulkan"
                        'Der Vulkan auf dieser Karte speit Feuer wie ungünstig
                        Dim Ziele(sInfo.Length - 5) As Point
                        For I = 4 To sInfo.Length - 1
                            Ziele(I - 4) = CPoint(sInfo(I))
                        Next
                        Dim WegX(Ziele.Length - 1) As Integer
                        Dim WegY(Ziele.Length - 1) As Integer
                        For I = 0 To Ziele.Length - 1
                            WegX(I) = Ziele(I).X
                            WegY(I) = Ziele(I).Y
                        Next
                        NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.VulkanFeuer, sInfo(2), sInfo(3), WegX, WegY, 0, 0, 0, 0, 0))
                    Case "verbessern"
                        NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.EinheitVerbessern, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), sInfo(6), 0, 0))
                    Case "treibstoff"
                        NetzBefehlEmpfangen(New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.EinheitTreibstoffSetzen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                End Select
            Case "Vorbereitung".ToLower
                If TypeOf Objektverwalter.Menü Is ObjektNetzwerkMenü Then
                    Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
                    If M.IsSpielInizialiesiert Or NetzHosten Then
                        Select Case sInfo(1).ToLower
                            Case "Bereit".ToLower
                                SyncLock NetzTeilnehmer
                                    For i = 0 To NetzTeilnehmer.Length - 1
                                        If NetzTeilnehmer(i).ID = SenderID Then
                                            NetzTeilnehmer(i).Bereit = True
                                            'In der Großen Routine nach My.Application.DoEvents() wird das überprüft.
                                        End If
                                    Next
                                End SyncLock
                            Case "NichtBereit".ToLower
                                SyncLock NetzTeilnehmer
                                    For i = 0 To NetzTeilnehmer.Length - 1
                                        If NetzTeilnehmer(i).ID = SenderID Then
                                            NetzTeilnehmer(i).Bereit = False
                                        End If
                                    Next
                                End SyncLock

                            Case "KO".ToLower
                                If sInfo(3).ToUpper = "Nothing".ToUpper Then
                                    M.KOS(sInfo(2), sInfo(4)) = Nothing 'Eigentlich wollen wir mehr einen KO wegmachen, als einen neuen erschaffen.
                                Else
                                    M.KOS(sInfo(2), sInfo(4)) = ObjektLadeklasse.NewKO(sInfo(3), sInfo(2))
                                End If
                            Case "KI".ToLower
                                Dim Stufe As ObjektSpieler.KIStufen = CInt(sInfo(3))
                                If Stufe = ObjektSpieler.KIStufen.Mensch Then
                                    M.SetKIStufe(sInfo(2), ObjektSpieler.KIStufen.Passiv)
                                Else
                                    M.SetKIStufe(sInfo(2), CInt(sInfo(3)))
                                End If
                            Case "Team".ToLower
                                M.Teams(sInfo(2)) = sInfo(3)
                                If M.Spielerdaten.Length >= sInfo(2) Then
                                    M.Spielerdaten(sInfo(2) - 1).SetTeam(M.Teams(sInfo(2)))
                                End If
                            Case "Farbe0".ToLower
                                Dim Tabelle As Color = Color.FromArgb(sInfo(3))
                                'Jetzt noch irgendwie setzen und evtl. anzeigen.
                                M.Farbtabellen(sInfo(2)) = Tabelle
                                M.Spielerdaten(sInfo(2) - 1).SetSpielerFarbe(sInfo(3))
                                If sInfo(2) = ObjektKartenauswahlMenü.MomentanerSpieler Then
                                    ObjektKartenauswahlMenü.KOAnzeigeTexturenKaden(Tabelle)
                                End If
                            Case "Farbe1".ToLower
                                Dim Tabelle As Color = AlleFarbtabellen(sInfo(3))
                                'Jetzt noch irgendwie die Tabelle laden mit dem Namen und evtl. anzeigen.
                                M.Farbtabellen(sInfo(2)) = Tabelle
                                M.Spielerdaten(sInfo(2) - 1).SetSpielerFarbe(sInfo(3).ToString)
                                If sInfo(2) = ObjektKartenauswahlMenü.MomentanerSpieler Then
                                    ObjektKartenauswahlMenü.KOAnzeigeTexturenKaden(Tabelle)
                                End If
                            Case "Startgeld".ToLower
                                M.Startfonds(sInfo(2)) = CInt(sInfo(3))
                            Case "GeldFabrik".ToLower
                                M.FondsproFabrik(sInfo(2)) = CInt(sInfo(3))
                            Case "GeldStadt".ToLower
                                M.FondsproStadt(sInfo(2)) = CInt(sInfo(3))
                            Case "BaulisteFest".ToLower
                                M.SetBauliste(sInfo(2), [Enum].Parse(ObjektKartenauswahlMenü.KartenAuswahlBaulisten.AW.GetType, (sInfo(3))))
                            Case "BaulisteOffen".ToLower
                                M.Baulisten(sInfo(2)) = New Bauliste(sInfo(3).Split("_"))
                            Case "updatebeendet"
                                M.ErstesUpdateEmpfangen = True
                            Case "regeln" 'Hier laden wir die Regeln...
                                Dim Unbes() As Integer = Nothing
                                If sInfo(10) <> "nothing" Then
                                    Unbes = ToIntArry(sInfo(10).Split("_"))
                                End If
                                Dim S As ObjektRegeln.Siegbedingungen() = ToIntArry(sInfo(4).Split("_"))
                                Dim W() As Integer = ToIntArry(sInfo(6).Split("_"))
                                Dim LS As Boolean = sInfo(11)
                                Dim ZW As Boolean = sInfo(5)
                                Dim N As Nebelarten = CInt(sInfo(2))
                                Dim ASp As Integer = CInt(sInfo(3))
                                Dim SW As ObjektSpielfeld.Wetterarten = CInt(sInfo(7))
                                M.Regeln = New ObjektRegeln(N, ASp, S, ZW, W, SW, CInt(sInfo(8)), CInt(sInfo(9)), Unbes, Nothing, Nothing, LS)
                                M.StartSpieler = sInfo(12)
                                M.Regeln.LevelModus = sInfo(13)
                                Dim AlterModus As CommanderWarsGameModi = My.Settings.CommanderWarsGameMoodus
                                My.Settings.CommanderWarsGameMoodus = sInfo(14)
                                If My.Settings.CommanderWarsGameMoodus <> AlterModus Then
                                    'wir müssen die neuen Texturen holen.
                                    Objektverwalter.LoadNewGameModus(My.Settings.TerrainStyle)
                                End If
                        End Select
                    End If
                Else
                    Select Case sInfo(1).ToLower
                        Case "Bereit".ToLower
                            SyncLock NetzTeilnehmer
                                For i = 0 To NetzTeilnehmer.Length - 1
                                    If NetzTeilnehmer(i).ID = SenderID Then
                                        NetzTeilnehmer(i).Bereit = True
                                        'In der Großen Routine nach My.Application.DoEvents() wird das überprüft.
                                    End If
                                Next
                            End SyncLock
                        Case "NichtBereit".ToLower
                            SyncLock NetzTeilnehmer
                                For i = 0 To NetzTeilnehmer.Length - 1
                                    If NetzTeilnehmer(i).ID = SenderID Then
                                        NetzTeilnehmer(i).Bereit = False
                                    End If
                                Next
                            End SyncLock
                    End Select
                End If
            Case "VorbereitungKarte".ToLower
                Select Case sInfo(1).ToLower
                    Case "Hash".ToLower
                        If TypeOf Objektverwalter.Menü Is ObjektNetzwerkMenü Then
                            Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
                            If Not M.IsSpielInizialiesiert Then
                                If Not M.KarteFestlegenHashcode(sInfo(2)) Then
                                    'OK, diese Karte haben wir nicht!
                                    NetzBefehlKartenauswahlSendenKarteAnfordern()
                                End If
                            End If
                        End If
                    Case "KarteAnfordern".ToLower
                        If NetzHosten Then
                            Hauptmenü.NetzDatenKartentransfer()
                        End If
                    Case "Nickname".ToLower
                        For i = 0 To NetzTeilnehmer.Length - 1
                            If NetzTeilnehmer(i).ID = SenderID Then
                                NetzTeilnehmer(i).Name = sInfo(2)
                                Exit For
                            End If
                        Next
                End Select
            Case "Chat".ToLower
                Dim Chat As String = ""
                For i = 3 To sInfo.Length - 2
                    Chat += sInfo(i) + "|"
                Next
                Chat += sInfo(sInfo.Length - 1)
                Dim nName As String = ""
                For i = 0 To NetzTeilnehmer.Length - 1
                    If NetzTeilnehmer(i).ID = SenderID Then
                        nName = NetzTeilnehmer(i).Name
                        Exit For
                    End If
                Next
                If nName Is Nothing Then nName = ""
                NetzChatEmpfangen(sInfo(1), sInfo(2), Chat, nName)
        End Select
    End Sub
    Private Shared Sub NetzBefehlRecieved(ByVal sender As Object, ByVal e As Microsoft.DirectX.DirectPlay.ReceiveEventArgs)
        Dim Paket As NetworkPacket = e.Message.ReceiveData 'Das Paket empfangen
        Dim Nachricht As String = Paket.ReadString
        If Nachricht.StartsWith("Karte:") Then
            'Die Frage ist nur: Wo speichern?
            Dim Pfad As String = ""
            Dim i As Integer = 1
            Dim gefunden As Boolean = False
            'Hier wird versucht zu schauen, ob es diese Karte bereits gibt.
            Dim Hash As Integer = Nachricht.Remove(0, 6).GetHashCode
            For Each dat In My.Computer.FileSystem.GetFiles(My.Settings.Resourcenpfad + "Karten")
                If My.Computer.FileSystem.ReadAllText(dat, Codierung).GetHashCode = Hash Then Exit Sub 'Wenn die Karte bereits existiert, können wir uns wichtigerem zuwenden.
            Next

            Do While Not gefunden
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Karten\NetzKarte" + i.ToString + ".map") Then
                    i += 1
                Else
                    Pfad = My.Settings.Resourcenpfad + "Karten\NetzKarte" + i.ToString + ".map"
                    gefunden = True
                End If
            Loop
            My.Computer.FileSystem.WriteAllText(Pfad, Nachricht.Remove(0, 6), False, Codierung)
            Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
            M.AddKarte(Pfad)
            If Not M.IsSpielInizialiesiert Then
                M.KarteFestlegenAn(M.Kartenname.Length - 1)
            End If
            Exit Sub
        End If
        NetzBefehlRecieved(Nachricht, e.Message.SenderID)
    End Sub
    Public Shared Sub NetzBefehlEmpfangen(ByVal Befehl As KIPassivNetzwerk.Befehl)
        If Not TypeOf Objektverwalter.Menü Is ObjektSpielMenü Then
            ' Console.WriteLine("Es kam zu einem verzögerten Spielstart")
            Dim s As String = " :=( "
            Dim i As Integer = s
            Threading.Thread.Sleep(100)
        End If
        Dim Spielmenü As ObjektSpielMenü = Objektverwalter.Menü
        If TypeOf Objektverwalter.Spielfeld.KI Is KIPassivNetzwerk Then

            If Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                Dim KIPassiv As KIPassivNetzwerk = Objektverwalter.Spielfeld.KI
                SyncLock KIPassiv.Befehle
                    KIPassiv.AddBefehl(Befehl)
                End SyncLock
            ElseIf Befehl.Spieler = 0 Then
                If Not Objektverwalter.Spielfeld.KI.Schleife Then
                    Dim KIPassiv As KIPassivNetzwerk = Objektverwalter.Spielfeld.KI
                    SyncLock KIPassiv.Befehle
                        KIPassiv.AddBefehl(Befehl)
                    End SyncLock
                Else
                    SyncLock NetzVorratsBefehle
                        NetzVorratsBefehle.Add(Befehl)
                    End SyncLock
                End If
            Else
                SyncLock NetzVorratsBefehle
                    NetzVorratsBefehle.Add(Befehl)
                End SyncLock
            End If
        Else
        SyncLock NetzVorratsBefehle
            NetzVorratsBefehle.Add(Befehl)
        End SyncLock
        End If
    End Sub
    Public Shared Sub NetzChatEmpfangen(ByVal Spieler As Integer, ByVal KOID As String, ByVal Nachricht As String, ByVal Nickname As String)
        Dim Gesichtsausdruck As ObjektKOTextZeile.KOGesichtsAusdruck = ObjektKOTextZeile.KOGesichtsAusdruck.Normal ' :|
        'Vielleicht wollte er ja aber einen besonderen Gesichtsausdruck
        If Nachricht.StartsWith(",,1") Then
            Gesichtsausdruck = ObjektKOTextZeile.KOGesichtsAusdruck.Lachend ' :)
            Nachricht = Nachricht.Remove(0, 3)
        End If
        If Nachricht.StartsWith(",,2") Then
            Gesichtsausdruck = ObjektKOTextZeile.KOGesichtsAusdruck.Normal ' :|
            Nachricht = Nachricht.Remove(0, 3)
        End If
        If Nachricht.StartsWith(",,3") Then
            Gesichtsausdruck = ObjektKOTextZeile.KOGesichtsAusdruck.Traurig ' :(
            Nachricht = Nachricht.Remove(0, 3)
        End If
        Dim SMenü As ObjektSpielMenü = Objektverwalter.Menü
        If Not SMenü.Cheat(Nachricht) Then
            Nachricht = Nickname + ": " + Nachricht
            'Jetzt sollte das "gesagte" noch irgendwie angezeigt werden.
            ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(KOID, Nachricht, Spieler, Gesichtsausdruck)})
        End If
    End Sub
    ''' <summary>
    ''' Let's save all Custom Units
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub NetzBefehlCustomStuffRecieved(ByVal Nachricht As String)
        If Nachricht.StartsWith("custom stuff:start") Then
            Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
            If Not M.CustomStuffReceieved Then
                For Each Directory In My.Computer.FileSystem.GetDirectories("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\", FileIO.SearchOption.SearchAllSubDirectories)
                    For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchTopLevelOnly)
                        My.Computer.FileSystem.DeleteFile(File)
                    Next
                Next
                If Not My.Computer.FileSystem.DirectoryExists("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\") Then
                    My.Computer.FileSystem.CreateDirectory("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\Sprites\") Then
                    My.Computer.FileSystem.CreateDirectory("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\Sprites\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\Sprites\(Optional) Zoomed Out\") Then
                    My.Computer.FileSystem.CreateDirectory("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\Sprites\(Optional) Zoomed Out\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\CO\") Then
                    My.Computer.FileSystem.CreateDirectory("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\CO\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\CO\CO Sprite\") Then
                    My.Computer.FileSystem.CreateDirectory("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\CO\CO Sprite\")
                End If
                If Not My.Computer.FileSystem.DirectoryExists("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\CO\CO Desc\") Then
                    My.Computer.FileSystem.CreateDirectory("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\CO\CO Desc\")
                End If
            End If
            'Unit saving:
        ElseIf Nachricht.StartsWith("custom stuff unit:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\" + N(1) + ".ent", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff unit image:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\Sprites\" + N(1) + ".png", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff unit image zoomed:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\Unit\Sprites\(Optional) Zoomed Out\" + N(1) + ".png", N(2), False, Codierung)
            'Custom CO saving:
        ElseIf Nachricht.StartsWith("custom stuff co:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\CO\" + N(1) + ".CCO", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff co desc:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\CO\CO Desc\" + N(1) + ".desc", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff co sprite:") Then
            Dim N() As String = Nachricht.Split(":")
            My.Computer.FileSystem.WriteAllText("C:\Programmierung\Commander Wars\Programm\Commander Wars\Advance Wars-Der wahre Feind\Resources\!Custom\Multiplayer\CO\CO Sprite\" + N(1) + ".png", N(2), False, Codierung)
        ElseIf Nachricht.StartsWith("custom stuff:end") Then
            Dim M As ObjektNetzwerkMenü = Objektverwalter.Menü
            M.CustomStuffReceieved = True
        End If

    End Sub

    ''' <summary>
    ''' Hier werden die Hostnamen(IP) und die Ports gefunden, auf denen man gerade Verbunden ist. (Sollte Also beispielsweise vom Host aufgerufen werden, allerdings erst NACHDEM er ein Spiel angefangen hat zu hosten.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub NetzGetEigeneIP()
        If NetzConnection Is Nothing Then Exit Sub
        Dim Addr() As Address = NetzConnection.GetLocalHostAddresses(LocalAddressFlags.None)
        For Each ad In Addr
            Dim Ur As String = ad.Url
            Dim s() As String = Ur.Split(";")
            Dim HostN As String = ""
            Dim PortN As Integer = -1
            For Each ss In s
                If ss.ToLower.StartsWith("hostname=") Then
                    HostN = ss.Remove(0, 9)
                ElseIf ss.ToLower.StartsWith("port=") Then
                    PortN = CInt(ss.Remove(0, 5))
                End If
            Next
            'Ich weiß nicht genau, wie diese Routine benutzt wird, also lass ich's besser mal so.
            '    Console.WriteLine("Netzwerk: Eigene Adresse gefunden: " + "Hostname: " + HostN + "    Port: " + PortN.ToString)
        Next
    End Sub
#End Region
#Region "Aufzeichnung"
    'Die Aufzeichnung läuft im Prinzip genauso ab, wie ein Netzwerkspiel.. Nur dass in eine Datei geschrieben wird, anstatt übers Netz gesendet.
    Private Shared AufzeichnungStrW As IO.StreamWriter
    Public Shared AufzeichnungStrR As IO.StreamReader
    ''' <summary>
    ''' Der Boolen, ob das Spiel aufgezeichnet wird. NICHT VERÄNDERN lieber AufzeichnungStart(), oder AufzeichnungEnde() aufrufen!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AufzeichnungAktiv As Boolean = False
    ''' <summary>
    ''' Der Boolen, ob eine Aufzeichnung abgespielt wird. NICHT VERÄNDERN lieber AufzeichnungStart(), oder AufzeichnungEnde() aufrufen!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared AufzeichnungAbspielen As Boolean = False
    Private Shared AufzeichnungAbspielenThread As Threading.Thread = Nothing
    Private Shared Aufzeichnungspfad As String = ""
    Public Shared AufzeichnungLaden As Boolean = False
    ''' <summary>
    ''' Das Spielfeld zu beginn der Aufzeichnung
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared StartSpielfeld As ObjektSpielfeld = Nothing
    ''' <summary>
    ''' The actual Record Position
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared RecordPosition As Integer = -1
    Public Shared Aufzeichnungsspulen As Boolean = False
    Dim AufzeichnungsPause As Boolean = False
    ''' <summary>
    ''' Lässt eine Aufzeichnung beginnen.
    ''' </summary>
    ''' <param name="NeuAufzeichnung">Wenn = True, wird eine neue Aufzeichnung erstellt, gegebenenfalls überschrieben. Bei False, wird eine Aufzeichnung angefangen, oder gegebenenfalls fortgesetzt.</param>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungStart(ByVal NeuAufzeichnung As Boolean)
        Dim Nam As String = "NoName"
        If Objektverwalter.Spielfeld IsNot Nothing Then
            Nam = Objektverwalter.Spielfeld.Kartenname
        End If
        AufzeichnungStart(Nam, NeuAufzeichnung)
    End Sub
    ''' <summary>
    ''' Lässt eine Aufzeichnung beginnen.
    ''' </summary>
    ''' <param name="Aufzeichnungsname">Name ohne Endung</param>
    ''' <param name="NeuAufzeichnung">Wenn = True, wird eine neue Aufzeichnung erstellt, gegebenenfalls überschrieben. Bei False, wird eine Aufzeichnung angefangen, oder gegebenenfalls fortgesetzt.</param>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungStart(ByVal Aufzeichnungsname As String, ByVal NeuAufzeichnung As Boolean)

        If AufzeichnungAktiv Then AufzeichnungEnde(Aufzeichnungspfad) 'hoppla, bevor wir anfangen, müssen wir das alte erstmal beenden.
        If Aufzeichnungsname.ToLower.EndsWith(".map") Then
            Aufzeichnungspfad = Aufzeichnungsname.Replace(".map", ".rpl")
        ElseIf Aufzeichnungsname.ToLower.EndsWith(".sav") Then
            Aufzeichnungspfad = Aufzeichnungsname.Replace(".sav", ".rpl")
        ElseIf Aufzeichnungsname.ToLower.EndsWith(".rpl") Then
            Aufzeichnungspfad = Aufzeichnungsname
        Else
            Aufzeichnungspfad = My.Settings.Resourcenpfad + "Record\active\" + Aufzeichnungsname + ".rpl"
        End If
        If Not My.Computer.FileSystem.DirectoryExists(My.Settings.Resourcenpfad + "Record\active\") Then
            My.Computer.FileSystem.CreateDirectory(My.Settings.Resourcenpfad + "Record\active\")
        End If
        If NeuAufzeichnung Then
            AufzeichnungStrW = New IO.StreamWriter(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", False, System.Text.Encoding.Unicode)
            AufzeichnungAktiv = True
            AufzeichnungWriteHeader(Aufzeichnungsname)
        Else
            If My.Computer.FileSystem.FileExists(Aufzeichnungspfad) Then
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl") Then
                    My.Computer.FileSystem.DeleteFile(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl")
                End If
                My.Computer.FileSystem.CopyFile(Aufzeichnungspfad, My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl")
                AufzeichnungStrW = New IO.StreamWriter(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", True, System.Text.Encoding.Unicode)
                AufzeichnungAktiv = True
            Else
                AufzeichnungStrW = New IO.StreamWriter(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", False, System.Text.Encoding.Unicode)
                AufzeichnungAktiv = True
                AufzeichnungWriteHeader(Aufzeichnungsname)
            End If
        End If

    End Sub
    Public Shared Sub AufzeichnungSichern(ByVal Zielpfad As String)
        My.Computer.FileSystem.CopyFile(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", Zielpfad, True)
    End Sub
    ''' <summary>
    ''' Bricht eine Aufzeichnung ab. Wenn man also ein Spiel beendet, ohne es gewonnen oder verloren zu haben.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungAbbrechen(ByVal Zielpfad As String)
        If Not AufzeichnungAktiv Then Exit Sub 'Was machen wir dann überhaupt hier?
        AufzeichnungStrW.Flush()
        AufzeichnungStrW.Close()
        AufzeichnungAktiv = False
        Aufzeichnungspfad = Zielpfad
        My.Computer.FileSystem.MoveFile(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", Aufzeichnungspfad)
    End Sub
    ''' <summary>
    ''' Finishes a Replay without saving it.
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungAbbrechen()
        If Not AufzeichnungAktiv Then Exit Sub 'Was machen wir dann überhaupt hier?
        AufzeichnungStrW.Flush()
        AufzeichnungStrW.Close()
        AufzeichnungAktiv = False
    End Sub
    ''' <summary>
    ''' Beendet eine Aufzeichnung ordnungsgemäß, wird NICHT aufgerufen, wenn ein Spiel beendet wird, ohne dass einer Gewonnen hat. Die Aufzeichnung wird beendet, das heißt sie kann nicht mehr fortgesetzt werden!
    ''' </summary>
    ''' <remarks></remarks>
    Public Shared Sub AufzeichnungEnde(ByVal Zielpfad As String)
        If Not AufzeichnungAktiv Then Exit Sub 'Was machen wir dann überhaupt hier?
        AufzeichnungStrW.Flush()
        AufzeichnungStrW.Close()
        Aufzeichnungspfad = Zielpfad
        If My.Computer.FileSystem.FileExists(Aufzeichnungspfad.Replace("\active\", "\") + "_old") Then
            My.Computer.FileSystem.MoveFile(Aufzeichnungspfad.Replace("\active\", "\") + "_old", Aufzeichnungspfad.Replace("\active\", "\") + "_old2", True)
        End If
        If My.Computer.FileSystem.FileExists(Aufzeichnungspfad.Replace("\active\", "\")) Then
            My.Computer.FileSystem.MoveFile(Aufzeichnungspfad.Replace("\active\", "\"), Aufzeichnungspfad.Replace("\active\", "\") + "_old", True)
        End If
        My.Computer.FileSystem.MoveFile(My.Settings.Resourcenpfad + "Record\active\AktuelleAufzeichnung.rpl", Aufzeichnungspfad.Replace("\active\", "\"), True)
        AufzeichnungAktiv = False
    End Sub
    Public Shared Sub AufzeichnungAbspielenStart(ByVal Pfad As String)
        If AufzeichnungAbspielen Then AufzeichnungAbspielenAbbruch() 'Na na na. erst das eine beenden, befor man das nächste anfängt.
        If Not My.Computer.FileSystem.FileExists(Pfad) Then Exit Sub 'In dem Fall haben wir hier nichts mehr zu suchen.
        AufzeichnungLaden = True
        AufzeichnungStrR = New IO.StreamReader(Pfad, System.Text.Encoding.Unicode)
        Aufzeichnungspfad = Pfad
        Dim Kartenname As String = AufzeichnungStrR.ReadLine
        If Kartenname.ToLower.StartsWith("Kartenname:".ToLower) Then
            Kartenname = Kartenname.Remove(0, 11)
            If Not Kartenname.EndsWith(".map") Then
                Kartenname += My.Settings.Resourcenpfad + "Karten\" + Kartenname + ".map"
            End If
            If Not My.Computer.FileSystem.FileExists(Kartenname) Then
                Dim F() As String = Kartenname.Split("\")
                Dim Found As Boolean = False
                For I = 0 To F.Length - 1
                    If Not Found Then
                        If F(I) = "Karten" Then
                            Found = True
                            Kartenname += My.Settings.Resourcenpfad + F(I) + "\"
                        End If
                    Else
                        If I = F.Length - 1 Then
                            Kartenname += F(I)
                        Else
                            Kartenname += F(I) + "\"
                        End If
                    End If
                Next
                If Not My.Computer.FileSystem.FileExists(Kartenname) Then
                    MsgBox("Map on which this record is based wasn't found! Open the record and check if the map under ""Kartenname:"" exists", MsgBoxStyle.Critical, "Map not found!")
                    AufzeichnungAbspielenAbbruch()
                    Exit Sub
                End If
            End If
            AufzeichnungAbspielen = True
            RecordPosition = 0
            'Erst die Karte laden
         
            Dim LSchirm As New ObjektLadebildschirm(2, "", Kartenname, False, ".map", False, False)


            Hauptmenü.Ini(Hauptmenü.Formmodi.Spiel, False, True)
            'dann den "unsichtbaren Spieler"
            StartSpielfeld = Objektverwalter.Spielfeld.Clone
            If StartSpielfeld.KI IsNot Nothing Then
                StartSpielfeld.KI.KIThreat.Abort()
                StartSpielfeld.KI.KIThreat = Nothing
            End If


            AufzeichnungAbspielenThreadBeenden() 'nur sicherheitshalber, eigentlich müsste er schon beendet werden.
            AufzeichnungAbspielenThread = New Threading.Thread(AddressOf AufzeichnungAbspielenThreadStarten)
            AufzeichnungAbspielenThread.Name = "Record Thread"
            AufzeichnungAbspielenThread.Start()


        Else
            Console.WriteLine(" Fehlerhafte Datei: " + Pfad)
        End If
    End Sub
    Public Shared Sub AufzeichnungAbspielenAbbruch()
        AufzeichnungStrR.Close()
        AufzeichnungAbspielen = False
    End Sub


    Private Shared Sub AufzeichnungWriteHeader(ByVal Aufzeichnungsname As String)
        AufzeichnenZeile("Kartenname:" + Aufzeichnungsname)
        ' AufzeichnenZeile("Spielerzahl:" + (Objektverwalter.Spielfeld.Spieler.Length - 1).ToString)
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            AufzeichnenSpieler(I)
        Next

    End Sub
    Private Shared Sub AufzeichnenSpieler(ByVal Spieler As Integer)
        Dim Z As String = "Spieler:" + Objektverwalter.Spielfeld.Spieler(Spieler).Spieler.ToString + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).Team + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).KOID + "|"
        If Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1) IsNot Nothing Then
            Z += Objektverwalter.Spielfeld.Spieler(Spieler).KOS(1).KOID + "|"
        Else
            Z += "Nothing|"
        End If
        Z += Objektverwalter.Spielfeld.Spieler(Spieler).FondsproStadt.ToString + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).Fabrikfonds.ToString + "|" '5
        If Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste Is Nothing Then
            Z += "Nothing|"
        Else
            Z += Objektverwalter.Spielfeld.Spieler(Spieler).Bauliste.ToString + "|"
        End If
        Z += Objektverwalter.Spielfeld.Spieler(Spieler).Fonds.ToString + "|" + _
        Objektverwalter.Spielfeld.Spieler(Spieler).Farbe.ToArgb.ToString
        AufzeichnenZeile(Z)
    End Sub
    Private Shared Sub AufzeichnenZeile(ByVal s As String)
        If Not AufzeichnungAktiv Then Exit Sub
        AufzeichnungStrW.WriteLine(s)
        AufzeichnungStrW.Flush()
        If s.Contains("System.Int32[]") Then
            s.ToString()
        End If
    End Sub


    Private Shared Sub AufzeichnungAbspielenThreadStarten()
        If (Not AufzeichnungAbspielen) Or (AufzeichnungStrR Is Nothing) Then
            AufzeichnungAbspielenThreadBeenden()
            Exit Sub
        End If
       
        While Not AufzeichnungStrR.EndOfStream
            NetzBefehlRecieved(AufzeichnungStrR.ReadLine, 7)
            RecordPosition += 1
            Dim VorratsBefehle As Integer = GetVorratsBefehle()
            Do Until GetVorratsBefehle() < 3
                Threading.Thread.Sleep(100) 'naja eigentlich muss man das natürlich so machen, dass einfach immer ein paar Befehle in der Warteschleife sind, aber ich möchte erstmal schauen, obs funktioniert.
            Loop
        End While
    End Sub
    Private Shared Sub RestartAufzeichnungAbspielen()
        If Objektverwalter.Spielfeld.KI IsNot Nothing Then
            Objektverwalter.Spielfeld.KI.KIThreat.Abort()
            Objektverwalter.Spielfeld.KI.KIThreat = Nothing
            Objektverwalter.Spielfeld.KI = Nothing
        End If
        NetzVorratsBefehle.Clear()
        SyncLock Objektverwalter.Spielfeld
            Objektverwalter.Spielfeld = StartSpielfeld.Clone
        End SyncLock
        If Objektverwalter.Spielfeld.KI IsNot Nothing Then
            Objektverwalter.Spielfeld.KI.KIThreat.Abort()
            Objektverwalter.Spielfeld.KI.KIThreat = Nothing
            Objektverwalter.Spielfeld.KI = Nothing
        End If
        AufzeichnungStrR = New IO.StreamReader(Aufzeichnungspfad)
        AufzeichnungStrR.ReadLine()
        For i = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            Dim sSp() As String = Hauptmenü.AufzeichnungStrR.ReadLine.Remove(0, 8).Split("|")
            Dim KO As ObjektKO = ObjektLadeklasse.NewKO(sSp(2), i)
            Dim B As Bauliste = Nothing
            If sSp(6).ToLower <> "nothing" Then
                B = New Bauliste(sSp(6).Split("_"))
            End If
            Objektverwalter.Spielfeld.Spieler(i) = New ObjektSpieler(sSp(0), Color.FromArgb(CInt(sSp(8))), sSp(4), New ObjektKO() {KO, ObjektLadeklasse.NewKO(sSp(3), i)}, sSp(7), KO.Armee, sSp(1), B, ObjektSpieler.KIStufen.Passiv, sSp(5))
        Next
        RecordPosition = 0
        Objektverwalter.Spielfeld.AktuellerSpieler = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
        Objektverwalter.Spielfeld.SpielStart()
    End Sub
    Private Shared Sub GotoRecordPosition(ByVal NewPosition As Integer)
        If NewPosition = RecordPosition Then Exit Sub
        If NewPosition < RecordPosition Then
            RestartAufzeichnungAbspielen()
        End If
        While Objektverwalter.Spielfeld.KI Is Nothing
            Threading.Thread.Sleep(5)
        End While
        Aufzeichnungsspulen = True
        For I = RecordPosition To NewPosition - 1
            CType(Objektverwalter.Spielfeld.KI, KIPassivNetzwerk).DoOrder(GetOrder(AufzeichnungStrR.ReadLine))
            RecordPosition += 1
        Next
        Aufzeichnungsspulen = False
    End Sub
    Private Shared Function GetOrder(ByVal line As String) As KIPassivNetzwerk.Befehl
        Dim sInfo() As String = line.Split("|") 'auseinander nehmen und dann bearbeiten
        Select Case sInfo(0).ToLower
            Case "Befehl1".ToLower
                Return (New KIPassivNetzwerk.Befehl(CInt(sInfo(1)), CInt(sInfo(2)), CInt(sInfo(3)), ToIntArry(sInfo(4).Split("$")), ToIntArry(sInfo(5).Split("$")), CInt(sInfo(6)), CInt(sInfo(7)), CSng(sInfo(8)), CSng(sInfo(9)), CInt(sInfo(10))))
            Case "Befehl0".ToLower
                Select Case sInfo(1).ToLower
                    Case "Wetter".ToLower
                        'Eine Wetteränderung, wie interressant :)
                        If sInfo.Length > 3 Then
                            Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, CInt(sInfo(3))))
                        Else
                            Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.WetterWechsel, CInt(sInfo(2)), 0, Nothing, Nothing, -1, -1, 0, 0, Objektverwalter.Spielfeld.AktuellerSpieler.Spieler))
                        End If
                    Case "SchlachtWechsel".ToLower
                        Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.Schlachtwechseln, 0, 0, New Integer() {0}, New Integer() {0}, 0, 0, 0, 0, sInfo(2)))
                    Case "Wolkenbewegen".ToLower
                        Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.WolkeBewegen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                    Case "vulkan"
                        'Der Vulkan auf dieser Karte speit Feuer wie ungünstig
                        Dim Ziele(sInfo.Length - 5) As Point
                        For I = 4 To sInfo.Length - 1
                            Ziele(I - 4) = CPoint(sInfo(I))
                        Next
                        Dim WegX(Ziele.Length - 1) As Integer
                        Dim WegY(Ziele.Length - 1) As Integer
                        For I = 0 To Ziele.Length - 1
                            WegX(I) = Ziele(I).X
                            WegY(I) = Ziele(I).Y
                        Next
                        Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.VulkanFeuer, sInfo(2), sInfo(3), WegX, WegY, 0, 0, 0, 0, 0))
                    Case "verbessern"
                        Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.EinheitVerbessern, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), sInfo(6), 0, 0))
                    Case "treibstoff"
                        Return (New KIPassivNetzwerk.Befehl(ObjektKI.KIModiExtern.EinheitTreibstoffSetzen, sInfo(2), sInfo(3), Nothing, Nothing, sInfo(4), sInfo(5), 0, 0, 0))
                End Select
        End Select
        Return Nothing
    End Function
    Private Shared Function GetVorratsBefehle() As Integer
        Dim Count As Integer = NetzVorratsBefehle.Count
        If Objektverwalter.Spielfeld IsNot Nothing Then
            If Objektverwalter.Spielfeld.KI IsNot Nothing Then
                If TypeOf Objektverwalter.Spielfeld.KI Is KIPassivNetzwerk Then
                    Dim AI As KIPassivNetzwerk = Objektverwalter.Spielfeld.KI
                    Count += AI.Befehle.Count
                End If
            End If
        Else
            Return 0
        End If
        Return Count
    End Function
    Private Shared Sub AufzeichnungAbspielenThreadBeenden()
        If AufzeichnungAbspielenThread Is Nothing Then Exit Sub 'Arbeit getan würde ich sagen ;)
        StartSpielfeld = Nothing
        AufzeichnungAbspielenThread.Abort()
    End Sub
#End Region


    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Const WM_SYSCOMMAND As Integer = &H112I
        Const SC_MINIMIZE As Integer = &HF020I
        Const SC_MAXIMIZE As Integer = &HF030I
        Const SC_CLOSE As Integer = &HF060I

        If ShowInTaskbar = False Then
            If (m.Msg = WM_SYSCOMMAND AndAlso m.WParam = CType(SC_MINIMIZE, IntPtr)) Then
                'Do whatever you need...
                'See above...
                Me.Visible = False
                If My.Settings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt Then Winterschlaf()
                If Me.Visible Then
                    Hauptmenü.MainMenü.UpdateStart.Start()
                End If
                Exit Sub
            End If
            If (m.Msg = WM_SYSCOMMAND AndAlso m.WParam = CType(SC_MAXIMIZE, IntPtr)) Then
                'See above...
                Me.Visible = False
                If My.Settings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt Then Winterschlaf()
                Exit Sub
            End If
            If (m.Msg = WM_SYSCOMMAND AndAlso m.WParam = CType(SC_CLOSE, IntPtr)) Then
                'Close prevent
                'Return einfach irgendwie exit sub, ohne das eben unten das MyBase.WndProc(m) aufgerufen wird. Wenn wir's hier abfangen, dann wird das wohl nie beendet werden!
                '
                'See above...
                Me.Visible = False
                If My.Settings.TaskAnzeigenModus = TaskleistenAnzeige.Versteckt Then Winterschlaf()
                Exit Sub
            End If
        End If
        'Für das normale einfach die Funktion aufrufen mit SizeChanged. Generell kann man dann ja..
        'if Me.WindowState = FormWindowState.Normal then

        MyBase.WndProc(m)
    End Sub
    Private Sub Winterschlaf()
        Dim Code() As Keys = {Keys.C, Keys.O, Keys.M, Keys.M, Keys.A, Keys.N, Keys.D, Keys.E, Keys.R, Keys.Space, Keys.W, Keys.A, Keys.R, Keys.S}
        Dim Ind As Integer = 0
        Do
            Threading.Thread.Sleep(1000)
            If getTasteGedrückt(Code(Ind)) Then
                Ind += 1
                If Ind >= Code.Length Then
                    Visible = True
                    Exit Sub
                End If
            Else
                Ind = 0
            End If
        Loop
    End Sub


#Region "Converter"
    Private Sub ConvertBmpIntoPngAllInDirectory(ByVal Pfad As String)
        For Each File In My.Computer.FileSystem.GetFiles(Pfad, FileIO.SearchOption.SearchAllSubDirectories, "*.bmp")
            ConvertBMPintoPNG(File)
        Next
    End Sub
    Private Sub ConvertBMPintoPNG(ByVal File As String)
        Dim Image As Image = Image.FromFile(File)
        Image.Save(File.Replace(".bmp", ".png"), System.Drawing.Imaging.ImageFormat.Png)
        Image.Dispose()
        My.Computer.FileSystem.DeleteFile(File)
    End Sub


    ''' <summary>
    ''' Erschafft eine Maske für alle Bilder im Ordner!
    ''' Top Level Only
    ''' </summary>
    ''' <param name="Directory"></param>
    ''' <remarks></remarks>
    Public Shared Sub CreateAllMasks(ByVal Directory As String)
        For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchTopLevelOnly, "*.png")
            CreateMask(File)
        Next
    End Sub
    ''' <summary>
    ''' Erschafft eine Maske für alle Bilder im Ordner!
    ''' Top Level Only
    ''' </summary>
    ''' <param name="Directory"></param>
    ''' <remarks></remarks>
    Public Shared Sub CreateAllMasksSubDirectory(ByVal Directory As String)
        For Each File In My.Computer.FileSystem.GetFiles(Directory, FileIO.SearchOption.SearchAllSubDirectories, "*.png")
            CreateMask(File)
        Next
    End Sub
    ''' <summary>
    ''' Erstellt eine Maske zu einer Einheit!
    ''' </summary>
    ''' <param name="File"></param>
    ''' <remarks></remarks>
    Public Shared Sub CreateMask(ByVal File As String)
        Dim B As Bitmap = Image.FromFile(File)
        Dim Maske As Image = New Bitmap(B.Width, B.Height, Drawing.Imaging.PixelFormat.Format32bppArgb)
        For I = 0 To My.Resources.Neutral.Width - 1
            Dim MomFarbe As Color = My.Resources.Neutral.GetPixel(I, 0)
            Dim EinFärbung As Color = My.Resources._NeutralGrau.GetPixel(I, 0)
            For X = 0 To B.Width - 1
                For Y = 0 To B.Height - 1
                    If B.GetPixel(X, Y) = MomFarbe Then
                        B.SetPixel(X, Y, Color.Transparent)
                        CType(Maske, Bitmap).SetPixel(X, Y, EinFärbung)
                    End If
                Next
            Next
        Next
        Maske = Grafikengine.Pixelneueinfärben(Maske, Color.Black, Color.Transparent)
        Maske.Save(File.ToLower.Replace(".png", "+Maske.png"), Drawing.Imaging.ImageFormat.Png)
        'Etwas kompliziert ich weiß!
        Dim B1 As Image = New Bitmap(B.Width, B.Height, Drawing.Imaging.PixelFormat.Format32bppArgb)
        For X = 0 To B.Width - 1
            For Y = 0 To B.Height - 1
                If B.GetPixel(X, Y) <> Color.Transparent Then
                    CType(B1, Bitmap).SetPixel(X, Y, B.GetPixel(X, Y))
                End If
            Next
        Next
        B.Dispose()
        B1.Save(File, Drawing.Imaging.ImageFormat.Png)
    End Sub

    Public Shared Function CStringColor(ByVal S As String) As Color
        Select Case S.ToLower
            Case "orange.bmp"
                Return Hauptmenü.AlleFarbtabellen(0)
            Case "blau.bmp"
                Return Hauptmenü.AlleFarbtabellen(1)
            Case "grün.bmp"
                Return Hauptmenü.AlleFarbtabellen(2)
            Case "gelb.bmp"
                Return Hauptmenü.AlleFarbtabellen(3)
            Case "schwarz.bmp"
                Return Hauptmenü.AlleFarbtabellen(4)
            Case "metall.bmp"
                Return Hauptmenü.AlleFarbtabellen(5)
            Case "gelbbraun.bmp"
                Return Hauptmenü.AlleFarbtabellen(6)
            Case "orangegelb"
                Return Hauptmenü.AlleFarbtabellen(7)
            Case "jade.bmp"
                Return Hauptmenü.AlleFarbtabellen(8)
            Case "lila.bmp"
                Return Hauptmenü.AlleFarbtabellen(9)
            Case "türkise.bmp"
                Return Hauptmenü.AlleFarbtabellen(10)
            Case "violet.bmp"
                Return Hauptmenü.AlleFarbtabellen(11)
            Case "dunkelblau.bmp"
                Return Hauptmenü.AlleFarbtabellen(12)
            Case "dunkelbraun.bmp"
                Return Hauptmenü.AlleFarbtabellen(13)
            Case "dunkelgrün.bmp"
                Return Hauptmenü.AlleFarbtabellen(14)
            Case "dunkelrosa.bmp"
                Return Hauptmenü.AlleFarbtabellen(15)
            Case "dunkelschwarz.bmp"
                Return Hauptmenü.AlleFarbtabellen(16)
            Case Else
                Return Hauptmenü.AlleFarbtabellen(Zufallszahl(0, Hauptmenü.AlleFarbtabellen.Length - 1))
        End Select
    End Function
#End Region


End Class
